hdoj1077 Catching Fish(幾何題,枚舉遍歷)

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章