d170: 飛蛾撲火(一)

Tags: computational-geometry


出處:https://zerojudge.tw/ShowProblem?problemid=d170
提交:https://zerojudge.tw/Submissions?problemid=d170&account=allllllan123456


問題:給定三個平面座標上的點,請問第三個點是否有落在以另外兩個點為端點的線段上?


解法:有公認作法。先用外積為零 (二維平面上可以看成斜率相等的移項結果) 檢查三點共線,再利用第三個點分別與第一、二個點所構成的兩個向量之內積結果不為正,以確保它有落在線段上。


 1#include <bits/stdc++.h>
 2using namespace std;
 3
 4int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); // IO 優化
 5    int X1, Y1, X2, Y2, X3, Y3, N; cin >> N;
 6    while (N--) {
 7        cin >> X1 >> Y1 >> X2 >> Y2 >> X3 >> Y3;
 8        if ((Y3-Y1)*(X2-X3) == (X3-X1)*(Y2-Y3) &&
 9            (X1-X3)*(X2-X3)<=0 && (Y1-Y3)*(Y2-Y3)<=0)
10            cout << "該死的東西!竟敢想讓我死!\n";
11        else
12            cout << "父親大人!母親大人!我快到了!\n";
13    }
14    return 0;
15}

no image