版权声明:转载请注明出处:https://blog.csdn.net/qq1013459920 https://blog.csdn.net/qq1013459920/article/details/84674751
1387: 简单的几何学
时间限制: 1 内存限制: 128 MB
题目描述
这是一个十分简单的几何学题目。现在给出N个点的坐标(x,y),保证x和y都是整数,你的任务是判断这N个点是否能构成正N边形。
输入
单组输入数据
第一行是N,(2<N<1000)
接下来有N行,每行两个数,代表这个点的坐标(x,y)
−1000≤x,y≤1000 且保证都为整数
输出
输出一行结果
如果可以构成正N边形,输出Yes,否则输出No
样例输入
4
0 50
0 -50
50 0
-50 0
样例输出
Yes
只有正四边形能由整数点构成,然后暴力求出所有边的长度判断是否四边相等,斜边最大且相等
AC Code:
#include <cstdio>
#include <cmath>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<map>
#include<queue>
#include<climits>
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
using namespace std;
typedef long long ll;
static const int MAX_N = 1e6 + 5;
int x[1005], y[1005];
double v[10];
double dis(int x1, int y1, int x2, int y2){
return sqrt((double)(x1 - x2) * (x1 - x2) + (double)(y1 - y2) * (y1 - y2));
}
int main(){
int n;
while(scanf("%d", &n) != EOF){
for(int i = 0; i < n; i++){
scanf("%d%d", &x[i], &y[i]);
}
if(n != 4) {
printf("No\n");
continue;
}
int len = 0;
for(int i = 0; i < n - 1; i++){
for(int j = i + 1; j < n; j++){
v[len++] = dis(x[i], y[i], x[j], y[j]);
}
}
sort(v, v + len);
if(v[0] == v[1] && v[1] == v[2] && v[2] == v[3] && v[4] == v[5] && v[4] != v[0]){
printf("Yes\n");
}
else printf("No\n");
}
return 0;
}