POJ 2606 Rabbit hunt(计算几何)

Description
给你n个点,求最多有多少点共线
Input
第一行为点数n,之后n行每行两个整数表示点的坐标
Output
输出共线点数最大值
Sample Input
6
7 122
8 139
9 156
10 173
11 190
-100 1
Sample Output
5
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);
    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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值