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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值