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;
}