概述
题目链接:http://poj.org/problem?id=1106
解法:
通过枚举每一个点,然后判断这个点的左边和右边分别有多少个点,然后统计一个最大值就好了
在判断的时候用斜率来判断比较好
斜率大于k的一定在直线的左边,反之就在左边
代码:
#include<stdio.h> #include<math.h> #define eps 1e-8 struct point { double x; double y; }; point p[1005]; point s; int n; int max(int a,int b) { if(a>b) return a; else return b; } int get_ans() { int i,cnt1,cnt2,ret=0,j; double k; for(i=1;i<=n;i++) { cnt1=0,cnt2=0; if(fabs(p[i].x-s.x)<eps) { for(j=1;j<=n;j++) { if(p[j].x>=s.x) cnt1++; if(p[j].x<=s.x) cnt2++; } } else { k=(p[i].y-s.y)/(p[i].x-s.x); for(j=1;j<=n;j++) { if(p[j].y-s.y<=k*(p[j].x-s.x)) cnt1++; if(p[j].y-s.y>=k*(p[j].x-s.x)) cnt2++; } } ret=max(ret,max(cnt1,cnt2)); } return ret; } int main() { int num,i; point t; double r,rr; while(scanf("%lf%lf%lf",&s.x,&s.y,&r)!=EOF) { if(r<0.0) break; scanf("%d",&num); n=0; for(i=1;i<=num;i++) { scanf("%lf%lf",&t.x,&t.y); rr=(t.x-s.x)*(t.x-s.x)+(t.y-s.y)*(t.y-s.y); if(rr<=r*r) { n++; p[n].x=t.x; p[n].y=t.y; } } if(n==0) { printf("0n"); continue; } int ans=get_ans(); printf("%dn",ans); } return 0; }
最后
以上就是健康灯泡为你收集整理的POJ 1106 计算几何的全部内容,希望文章能够帮你解决POJ 1106 计算几何所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复