这是道计算几何的简单题,只要以每一个与圆心距离小于等于圆半径的点和圆心构成半圆的直径线,然后找在直径右侧且距圆心距离小于等于圆的半径的点的个数,记录最大值就行了。
#include<stdio.h>
#include<math.h>
double eps=1e-8;
double abs(double a) //绝对值
{
if(a<0)
return -a;
return a;
}
struct Point{
int x,y;
};
Point circle;
Point p[200];
double r;
double distance(Point p1,Point p2) //点距
{
double x=double(p1.x-p2.x);
double y=double(p1.y-p2.y);
return sqrt(x*x+y*y);
}
int mul(Point p1,Point p2,Point c) //cp1,cp2的叉积
{
return (p1.x-c.x)*(p2.y-c.y)-(p1.y-c.y)*(p2.x-c.x);
}
int main()
{
int n,i,j;
while(scanf("%d %d %lf",&circle.x,&circle.y,&r) && r>-eps)
{
int max=0;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d %d",&p[i].x,&p[i].y);
for(i=0;i<n;i++)
if(distance(p[i],circle)-r<eps) //枚举构成半圆直径的另一个点
{
int cnt=1;
for(j=0;j<n;j++)
{
if(j==i)
continue;
if(distance(p[j],circle)-r<eps && mul(p[i],p[j],circle)>=0) //只要判断一个方向
cnt++;
}
if(cnt>max)
max=cnt;
}
printf("%d\n",max);
}
return 0;
}