On a two-dimensional plane, give you n integer points. Your task is to figure out how many different regular polygon these points can make.
4 0 0 0 1 1 0 1 1 6 0 0 0 1 1 0 1 1 2 0 2 1
12
因为给的点坐标全是整数,那么就是计算正四边形的个数,只有正方形才可以使所有的点为整数点。那么由两个点便可以得到可能满足正方形情况的两个点,判断这两个点是否存在就好了,注意在计算的过程中每个正方形有四条边所以会被统计四遍,最终结果应是 ans/4。
PS:给的数据点的范围是[-100,100],因此对点的坐标+100进行处理。已知: (x1,y1) (x2,y2)
则: x3=x1+(y1-y2) y3= y1-(x1-x2)
x4=x2+(y1-y2) y4= y2-(x1-x2)
或
x3=x1-(y1-y2) y3= y1+(x1-x2)
x4=x2-(y1-y2) y4= y2+(x1-x2)一般的在横坐标 或 纵坐标都相同的就不考虑了,(x1-x2)或(y1-y2)为0,一定满足
我们只考虑在如下情况的正方形图一 当(x1, y1) (x2,y2)在如下位置时 他能找到的(x3,y3)(x4,y4) 有实线和虚线 围成的两种方案
同理,还有另外一种2种排法
因此,确定2个点(一条边) 都能找到与之对应的 2个四边形,那么4条边 就有8个 但4个是重复的 所以 /4
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int book[500][500]; int main() { int xx[10000]; int yy[10000]; int n,m,i,j,x1,y1,x2,y2,x3,y3,x4,y4; while(scanf("%d",&n)!=EOF) { int sum=0; memset(book,0,sizeof(book)); for(i=0; i<n; i++) { scanf("%d %d",&xx[i],&yy[i]); xx[i]+=100; yy[i]+=100; book[xx[i]][yy[i]]=1; } for(i=0; i<n; i++) { for(j=i+1; j<n; j++) { int dx,dy; dx=xx[j]-xx[i]; dy=yy[j]-yy[i]; x1=xx[j]; x2=xx[i]; y1=yy[j]; y2=yy[i]; if(x1+dy>=0&&x1+dy<=200&& y1-dx>=0&&y1-dx<=200&& x2+dy>=0&&x2+dy<=200&& y2-dx>=0&&y2-dx<=200&& book[x1+dy][y1-dx]==1&& book[x2+dy][y2-dx]==1) { sum++; } if(x1-dy>=0&&x1-dy<=200&& y1+dx>=0&&y1+dx<=200&& x2-dy>=0&&x2-dy<=200&& y2+dx>=0&&y2+dx<=200&& book[x1-dy][y1+dx]==1&& book[x2-dy][y2+dx]==1) { sum++; } } } printf("%d\n",sum/4); } return 0; }