hdu 6055

题意,二维平面上给N个整数点,问能构成多少个不同的正多边形。

题解:容易得知只有正四边形可以使得所有的顶点为整数点。(具体证明可参考杨景钦在2017的国家队论文) 所以正解即求出所有的正四边形个数。

枚举2个点,然后暴力判断另外2个点的位置是否存在。复杂度 N*N*logN。

已知2个点,怎么求另外2个点,我们假设这2个点组成的边不是对角线,那么最后答案除以4即可,用向量画图推下

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 struct node{
 5     int x,y;
 6 }a[505];
 7 int vis[705][705];
 8 int sum;
 9 void check(node p,node q){
10     int x=p.x-q.x;
11     int y=p.y-q.y;
12     if(p.y-x>=0&&q.y-x>=0&&p.x+y>=0&&q.x+y>=0&&vis[p.x+y][p.y-x]&&vis[q.x+y][q.y-x]) sum++;
13     if(p.x-y>=0&&q.x-y>=0&&p.y+x>=0&&q.y+x>=0&&vis[p.x-y][p.y+x]&&vis[q.x-y][q.y+x]) sum++;
14   
15 }
16 
17 int main(){
18     int n;
19     while(scanf("%d",&n)!=EOF){
20         int xx,yy;
21         memset(vis,0,sizeof(vis));
22         for(int i=1;i<=n;i++) {
23             scanf("%d%d",&xx,&yy);
24             a[i].x=xx+200;
25             a[i].y=yy+200;
26             vis[xx+200][yy+200]=1;
27         }
28          sum=0;
29         for(int i=1;i<=n;i++){
30             for(int j=i+1;j<=n;j++){
31                 check(a[i],a[j]);
32             }
33         }
34         cout<<sum/4<<endl;
35     }
36 }

 

posted on 2017-07-27 19:36  hhhhx  阅读(622)  评论(3编辑  收藏  举报

导航