POJ1106(计算几何 判断折线方向)

题目链接: http://poj.org/problem?id=1106

 

题意: 给出一个半圆形的坐标和半径,另给出一些平面内的点,求此半圆最多覆盖的点的数目.

 

解题思路:很简单的计算几何题,枚举半圆直径所在的边,水之~

8491066 dooder_daodao 1106 Accepted 164K 0MS C++ 962B 2011-04-15 09:09:40

 

 

 

#include<stdio.h> #include<string.h> #include<math.h> const double eps = 1e-8; const double f = 10e8; #define M 158 typedef struct { double x,y; }Point; Point p[M]; Point o; double r; int n; double Dis(Point p,Point q) { return (p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y); } double Multi(Point p,Point q,Point o) { return (p.x-o.x)*(q.y-o.y)-(q.x-o.x)*(p.y-o.y); } int main() { int i,j,tmpl,tmpr,ans; double d; while(scanf("%lf%lf%lf",&o.x,&o.y,&r),r>=0){ r=r*r; scanf("%d",&n); for(i=0;i<n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); ans=0; for(i=0;i<n;i++){ tmpl=tmpr=0; for(j=0;j<n;j++){ d=Dis(p[j],o); if(d<r||fabs(d-r)<eps){ d=Multi(p[j],p[i],o); if(fabs(d)<eps) tmpl++,tmpr++; else if(d>0.0) tmpl++; else tmpr++; } } if(tmpl>ans) ans=tmpl; if(tmpr>ans) ans=tmpr; } printf("%d/n",ans); } return 0; }

你可能感兴趣的:(POJ1106(计算几何 判断折线方向))