Bailian4072 判斷多個點是否在同一直線

4072:判斷多個點是否在同一直線
總時間限制: 1000ms 內存限制: 65536kB
描述
有N(1<=n<=100)< span="">個互不重合的點,並給出它們的座標(xi,yi),問這些點是否在同一直線上。

輸入
第一行是測試的組數T(1<=T<=100),其後是T組數據,每組數據第一行是該組數據點的數量N,後面跟着N行,每行代表一點的座標,由兩個數字構成,這兩個數字之間由空格隔開。
輸出
有T行,每行對應輸入的一組數據,如果該組數據中的點在同一直線上,則該行輸出True,否則輸出False。
樣例輸入
1
3
0 0
2 2
1 1
樣例輸出
True

問題鏈接Bailian4072 判斷多個點是否在同一直線
問題簡述:(略)
問題分析:判斷多點共線問題,斜率相同則爲共線。通過計算斜率進行判定則需要用到浮點運算,而且還要用到出發。需要轉換一下計算方式,使用乘法運算和整數運算來進行判定。
程序說明:(略)
參考鏈接:(略)
題記:(略)

AC的C++語言程序如下:

/* Bailian4072 判斷多個點是否在同一直線 */

#include <iostream>
#include <vector>

using namespace std;

struct Point {
    int x, y;
};

int main()
{
    int t, n;
    cin >> t;
    while(t--) {
        cin >> n;

        vector<Point> p;
        int x, y;
        for(int i = 0; i < n; i++) {
            cin >> x >> y;
            p.push_back({x, y});
        }

        bool flag = true;
        if(n <= 2) cout << "True" << endl;
        else {
            int dx = p[1].x - p[0].x;
            int dy = p[1].y - p[0].y;
            for(int i = 2; i < n; i++)
                if((p[i].x - p[i - 1].x) * dy != (p[i].y - p[i - 1].y) * dx)
                    flag = false;

            cout << (flag ? "True" : "False") << endl;
        }
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章