P10057 题解
很明显,答案只会是 \(0,1,2\) 中的一个。先判定 \(C\) 点是否在直线 \(x=x_A\) 与 直线 \(x=x_B\) 之间,然后判定 \(C\) 与 \(D\) 是否一个在 \(AB\) 上方,一个在 \(AB\) 下方,若为真则相交,输出 \(0\),否则只需平移一次,输出 \(1\)。若 \(C\) 点不在直线 \(x=x_A\) 与 直线 \(x_B\) 之间,那么反过来,判定 \(A\) 点是否在直线 \(x=x_C\) 与直线 \(x=x_D\) 之间,然后对 \(AB\) 进行与上文同样的操作。若上文的判定都假了,输出 \(2\)。
#include<bits/stdc++.h>
using namespace std;
int x[10], y[10], n;
int main() {
cin >> n;
while (n--) {
for (int i = 1; i <= 4; ++i) cin >> x[i] >> y[i];
if (x[3] <= x[2] && x[3] >= x[1]) {
if (max(y[3], y[4]) >= y[1] && min(y[3], y[4]) <= y[1]) cout << 0 << '\n';
else cout << 1 << '\n';
}
else if (max(y[3], y[4]) >= y[1] && min(y[3], y[4]) <= y[1]) cout << 1 << '\n';
else cout << 2 << '\n';
}
return 0;
}

浙公网安备 33010602011771号