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