1. 程式人生 > >HNCMU1387: 簡單的幾何學解題報告---判斷n個整點能否構成正n邊形

HNCMU1387: 簡單的幾何學解題報告---判斷n個整點能否構成正n邊形

                                       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;
}