Dancing Stars on Me HDU - 5533 长春站

传送门

题目大意:给n个星星的坐标, 如果这些星星能组成正多边形(凸多边形)。

解题思路:正多边形一定有一个外接圆, 外接圆圆心到每个顶点的距离都等与圆半径r, 我们只需要求圆心, 然后看每个顶点到圆心距离是不是等于r就可以了。 

圆心怎么得到呢, 因为他是正多边形, 那么所有顶点的中心就是圆心(这个我没证明, 凭感觉, 逃~)。

代码:

#include <iostream>
#include <cstdio>

using namespace std;

struct NOD
{
	double x, y;
}A[120];


double len(NOD n1, NOD n2)
{
	return (n1.x - n2.x)*(n1.x-n2.x) + (n1.y - n2.y)*(n1.y-n2.y);
}

int main()
{
	int T;
	cin >> T;
	while(T--)
	{
		int n;
		scanf("%d", &n);
		for(int i=1; i<=n; i++)
			scanf("%lf%lf", &A[i].x, &A[i].y);
		int ok = 1;
		A[0].x = 0; A[0].y = 0;
		for(int i=1; i<=n; i++)
		{
			A[0].x += A[i].x;
			A[0].y += A[i].y;
		}
		A[0].x /= n;
		A[0].y /= n;
		double r = len(A[0], A[1]);
		for(int i=1; i<=n; i++)
			if(len(A[0], A[i]) != r) {ok = 0; break;}
		printf("%s\n", ok ? "YES" : "NO");
	}
	return 0;
}







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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值