您的位置:首页 > 其它

POJ 1118 && HDU 1432 Lining Up(计算几何)

2015-08-23 14:45 411 查看
Description

给你n个点,求最多有多少点共线

Input

多组输入,每组用例第一行为点数n(n<700),接下来n行为每个点的坐标x,y,以n=0结束输入

Output

对每组用例,输出共线点数最大值

Sample Input

5

1 1

2 2

3 3

9 10

10 11

0

Sample Output

3

Solution

暴力枚举两点,求出两点之后有多少点与这两点共线,更新最大值即可,其中当共线点数已经大于总点数一半时结束枚举,这是一步重要的剪枝

Code

#include<stdio.h>
#define  X(x1,y1,x2,y2,x3,y3) ((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1))//判断三点是否共线
#define max(x,y) x>y?x:y
int main()
{
int n,i,j,k,z[701][2],count,max=0,flag1,flag2;
scanf("%d",&n);
while(n!=0)
{
flag1=n/2;
flag2=0;//标志变量
max=0;
for(i=0;i<n;i++)
scanf("%d%d",&z[i][0],&z[i][1]);
for(i=0;!flag2&&i<n;i++)//暴搜
for(j=i+1;!flag2&&j<n;j++)
{
count=2;
for(k=j+1;k<n;k++)
if((!X(z[i][0],z[i][1],z[j][0],z[j][1],z[k][0],z[k][1]))&&(!X(z[j][0],z[j][1],z[k][0],z[k][1],z[i][0],z[i][1])))//判断三点是否共线
count++;
if(count>flag1)//若共线点数已经超过所有点的一半则不用继续搜索了
{
printf("%d\n",count);
flag2=1;
}
max=max(max,count);//更新最多共线点数
}
if(!flag2)
printf("%d\n",max);
scanf("%d",&n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: