zl程序教程

您现在的位置是:首页 >  其它

当前栏目

【2017 Multi-University Training Contest - Team 2】 Regular polygon

2017 multi Contest Training Team regular University polygon
2023-09-14 09:03:49 时间

Link:

Description

给你n个点整数点;
问你这n个点,能够组成多少个正多边形

Solution

整点只能构成正四边形.
则先把所有的边预处理出来;
枚举每某两条边为对角线的情况;
看看这两条对角线能否组成一个正方形;
可以的话,递增答案.

NumberOf WA

1

Reviw

(排序的时候边的数目和点的弄混了)

Code

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 500;

struct abc{
    int x[2],y[2],dis;
};

abc bian[N*N+100];
int x[N+10],y[N+10];
int n,tot;

int sqr(int x){
    return x*x;
}

int get_dis(int i,int j){
    return sqr(x[i]-x[j])+sqr(y[i]-y[j]);
}

bool cmp(abc a,abc b){
    return a.dis < b.dis;
}

main(){
    while (~scanf("%lld",&n)){
        int ans = 0;
        tot = 0;
        for (int i = 1;i <= n;i++)
            scanf("%lld%lld",&x[i],&y[i]);
        for (int i = 1;i <= n-1;i++)
            for (int j = i+1;j <= n;j++){
                tot++;
                bian[tot].x[0] = x[i],bian[tot].y[0] = y[i];
                bian[tot].x[1] = x[j],bian[tot].y[1] = y[j];
                bian[tot].dis = get_dis(i,j);
            }
        sort(bian+1,bian+1+tot,cmp);
        for (int i = 1;i <= tot;i++){
            int j = i;
            while (j+1 <= tot && bian[j+1].dis == bian[i].dis) j++;
            for (int k = i;k <= j-1;k++)
                for (int l = k+1;l <= j;l++){
                    int x1 = bian[k].x[0],y1 = bian[k].y[0];
                    int x2 = bian[k].x[1],y2 = bian[k].y[1];
                    int x3 = bian[l].x[0],y3 = bian[l].y[0];
                    int x4 = bian[l].x[1],y4 = bian[l].y[1];
                    if ( (x1+x2==x3+x4) && (y1+y2 == y3+y4) ){
                        if ( (x2-x1)*(x4-x3) + (y2-y1)*(y4-y3) == 0){
                            ans++;
                        }
                    }
                }
            i = j;
        }
        printf("%lld\n",ans);
    }
    return 0;
}