UVa 270 - Lining Up

题目链接:UVa 270 - Lining Up

暴力枚举,一直向后枚举,否则会超时。

判断是否三点共线使用斜率相等判断,将除法改成乘法以减少精度损失。

这题输入有点麻烦,看了别人写的才知道怎么整。

注意需要使用两个getchar()吸收两个回车符。

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <cstring>

const int MAX_N = 700 + 10;

using namespace std;

struct point
{
    int x,y;
};
point p[MAX_N];
int T;
char str[50];

bool judge(int i,int j,int k)
{
    if((p[j].y - p[i].y) * (p[k].x - p[j].x) == (p[k].y - p[j].y) * (p[j].x - p[i].x))
        return true;
    return false;
}

int main()
{
    cin>>T;
    getchar();
    getchar();
    while(T--)
    {
        int res = 2;
        int temp = 2;
        int num = 0;
        while(gets(str))//gets失败不进入while,如果读到换行就为空,但是还会进入while
        {
            if(!str[0])
                break;
            sscanf(str,"%d%d",&p[num].x , &p[num].y);
            num++;
        }
        for(int i = 0;i < num;i++)
        {
            for(int j = i + 1;j < num;j++)
            {
                temp = 2;
                for(int k =  j + 1;k < num;k++)
                {
                    if(k != i && k != j)
                    {
                        if(judge(i,j,k))
                            temp++;
                    }
                }
                if(temp > res)
                    res = temp;
            }
        }
        cout<<res<<endl;
        if(T)
           cout<<endl;
    }
    return 0;
}


你可能感兴趣的:(UVa 270 - Lining Up)