HNCMU1387: 简单的几何学解题报告---判断n个整点能否构成正n边形

版权声明:转载请注明出处: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;
}

猜你喜欢

转载自blog.csdn.net/qq1013459920/article/details/84674751
今日推荐