来源:http://acm.hdu.edu.cn/showproblem.php?pid=1077
可以由两个点确定两个圆心。圆心与两个点的距离为1,画图易知,圆心位于两点连线的中垂线上,
本题的关键就在于求出圆心坐标。
存在两种情况
1.当两点的y值相等。
2.当两点的y值不等。
具体见代码:
#include<stdio.h>
#include<math.h>
#include<string>
using namespace std;
struct point
{
double x,y;
};
point p[305];
point a,b;//对称的两个圆点
double dist(point m,point n)//两点距离
{
return sqrt((m.x-n.x)*(m.x-n.x)+(m.y-n.y)*(m.y-n.y));
}
void getcp(point m,point n)//得到圆点坐标
{
point p1;
double edge,dis;
p1.x=(m.x+n.x)/2;p1.y=(n.y+m.y)/2;
dis=dist(p1,m);
edge=sqrt(1-dis*dis);
if(fabs(m.y-n.y)<1e-4)
{
a.x=p1.x;
a.y=p1.y+edge;
b.x=p1.x;
b.y=p1.y-edge;
}
else
{
double angel=atan(-(m.x-n.x)/(m.y-n.y));
a.x=p1.x+edge*cos(angel);
a.y=p1.y+edge*sin(angel);
b.x=p1.x-edge*cos(angel);
b.y=p1.y-edge*sin(angel);
}
}
int main()
{
int t,n,i,j,k;
int cnt,max;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
max=1;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if(dist(p[i],p[j])>2.0)continue;
getcp(p[i],p[j]);
cnt=0;
for(k=0;k<n;k++)
{
if(dist(p[k],a)<1+1e-4)cnt++;
}
if(cnt>max)max=cnt;
cnt=0;
for(k=0;k<n;k++)
{
if(dist(p[k],b)<1+1e-4)cnt++;
}
if(cnt>max)max=cnt;
}
printf("%d\n",max);
}
return 0;
}