首页 > 代码库 > hdu1077

hdu1077

#include<iostream>
#include<cmath>
using namespace std;

struct Point
{
double x,y;
};

double dis_sq(const Point& a,const Point& b) //距离平方
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}

Point lock_center(const Point& a,const Point& b)
{
Point s,e,m;
double d,c,ang;

s.x=b.x-a.x; //用于计算角度
s.y=b.y-a.y;
m.x=(a.x+b.x)/2.0; //中点
m.y=(a.y+b.y)/2.0;
d=dis_sq(a,m);
c=sqrt(1.0-d);
if(fabs(s.y)<1e-8) //ab是直径
{
e.x=m.x;
e.y=m.y+c;
}
else
{
ang=atan(-s.x/s.y); //求弦ab的垂直平分线与x轴所成的夹角
e.x=m.x+c*cos(ang);
e.y=m.y+c*sin(ang);
}
return e;
}

int main()
{
int T,n,i,j,k,ans,tmp;
Point p[310],c;

scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
ans=1; //一个点时为1种
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(dis_sq(p[i],p[j])<=4.0) //平方
{
c=lock_center(p[i],p[j]);
tmp=0;
for(k=0;k<n;k++)
if(sqrt(dis_sq(c,p[k]))<=1.0001)
tmp++;
if(ans<tmp)
ans=tmp;
}
cout<<ans<<endl;
}
return 0;
}

hdu1077