HNCMU1387: 簡單的幾何學解題報告---判斷n個整點能否構成正n邊形
阿新 • • 發佈:2018-12-06
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; }