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;
}


阅读更多
文章标签: 杭电 算法
个人分类: oj
上一篇hdoj1076 An Easy Task(简单题)
下一篇hdoj1079 Calendar Game(分析奇偶,找规律,博弈)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭