给定一些点,和一个圆心坐标,求一个以这个点为圆心的半圆能最多能圈下多少点。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; #define hPI 1.5707963267949 #define eps 1e-8 struct point { double x; double y; }; double cross(point a,point b,point c){ a.x-=c.x;a.y-=c.y; b.x-=c.x;b.y-=c.y; return a.x*b.y-a.y*b.x; } double mul(point a,point b,point c) { a.x-=c.x;a.y-=c.y; b.x-=c.x;b.y-=c.y; return a.x*b.x+a.y*b.y; } double dist(point a,point b) { return sqrt(mul(a,a,b)); } double angle(point a,point b,point c) { return cross(a,b,c)/dist(a,c)/dist(b,c); } int main() { double r,t; point p[200],o; int lp,i,j,ans,t1,t2; while (scanf("%lf%lf%lf",&o.x,&o.y,&r) != EOF) { if (r < 0) break; ans=0; scanf("%d",&lp); for (i=0; i<lp; i++) { scanf("%lf%lf",&p[i].x,&p[i].y); } for (i=0; i<lp; i++) { t1=1; t2=1; t=dist(p[i],o); if (t > r) continue; for (j=0; j<lp; j++) { if (i == j) continue; t=dist(p[j],o); // printf("%d %d %lf ",i,j,t); if (t > r) continue; t=angle(p[i],p[j],o); //printf(" %lf\n",t); if (t > 0) t1++; else if (t < 0) t2++; else if (fabs(t-0.0) < eps) { t1++; t2++; } } // printf("\nt1=%d t2=%d\n",t1,t2); t1=t1>t2?t1:t2; ans=ans>t1?ans:t1; } printf("%d\n",ans); } }