P10057 题解

· · 题解

很明显,答案只会是 0,1,2 中的一个。先判定 C 点是否在直线 x=x_A 与 直线 x=x_B 之间,然后判定 CD 是否一个在 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;
}