题目大意:给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;
}