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;
}
posted @ 2024-01-14 19:14  FurippuWRY  阅读(16)  评论(0)    收藏  举报