题意,二维平面上给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 }