欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Bailian4072 判断多个点是否在同一直线

程序员文章站 2022-03-02 10:56:30
...

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