來源: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;
}