【HDU5533 2015长春赛区G】【结论题】Dancing Stars on Me 平面图的整点正多边形只有正四边形

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;}
template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;}
const int N=105,M=0,Z=1e9+7,ms63=1061109567;
int casenum,casei;
int n;
int y[N],x[N];
int b[10];
bool check()
{
	if(n!=4)return 0;
	int m=0;
	for(int i=1;i<=4;i++)
	{
		for(int j=i+1;j<=4;j++)
		{
			b[++m]=(y[i]-y[j])*(y[i]-y[j])+(x[i]-x[j])*(x[i]-x[j]);
		}
	}
	sort(b+1,b+m+1);
	return b[2]==b[1]
			&&b[3]==b[2]
			&&b[4]==b[3]
			&&b[5]==2*b[4]
			&&b[6]==b[5];
}
int main()
{
	scanf("%d",&casenum);
	for(casei=1;casei<=casenum;casei++)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;i++)scanf("%d%d",&y[i],&x[i]);
		puts(check()?"YES":"NO");
	}
	return 0;
}
/*
【题意】
T(300)组数据。
对于每组数据,给你n([3,100])个点,每个点的坐标都在[-10000,10000]之间。
所有坐标都不相同。
我们想知道这些点是否可以连接构成正n边形。

【类型】
结论题

【分析】
有结论,平面上的正多边形只可能是正四边形。
于是我们只在n==4的时候判定。
判定方法是求出每两个点之间的距离的平方。
是否比例是1:1:1:1:2:2。
因为这个是在平面图上,不会有立体图形的干扰,所以这个判定条件就是充要的。

*/

你可能感兴趣的:(算法,ACM,ICPC,HDU,脑洞)