题意:n个坐标,问能组成多少正方形。 思路:先按x轴优先排序,然后枚举每两个点是否能组成正方形。涉及到坐标的旋转及简单hash操作。 x'=xcos(a)-ysin(a); y'=xsin(a)+ycos(a). #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; #define maxn 19998 class point { public: int x,y; point * next; bool operator ==(const point & p) { return p.x ==x&&p.y ==y; } }; point date[1005]; point *hash[20000]; int n; void insert(point p) { int key=p.x*p.x +p.y*p.y ; point * m=new point ; m->x =p.x ;m->y =p.y ; m->next =hash[key%maxn]; hash[key%maxn]=m; } bool cmp(point &a,point &b) { if(a.x <b.x )return true; if(a.x ==b.x &&a.y<b.y )return true; return false; } bool find(point * p) { int key=p->x*p->x +p->y*p->y ; point *q=hash[key%maxn]; while(q) { if(*q==*p) return true; q=q->next ; } return false; } void solve() { int i,j; int num=0; point *q1=new point; point *q2=new point; point *q3=new point; point *q4=new point; for(i=0;i<n;i++) for(j=i+1;j<n;j++) { q1->x =date[i].x ;q1->y=date[i].y; q2->x =date[j].x ;q2->y=date[j].y; q3->x =q1->x +q1->y -q2->y ; q3->y =q1->y +q2->x -q1->x ; q4->x =q1->y -q2->y +q2->x ; q4->y =q2->y +q2->x -q1->x ; if(find(q3)&&find(q4)) num++; } cout<<num/2<<endl; } int main() { int i; while(scanf("%d",&n)&&n) { for(i=0;i<20000;i++) hash[i]=NULL; for(i=0;i<n;i++) { cin>>date[i].x >>date[i].y ; insert(date[i]); } sort(date,date+n,cmp); solve(); } return 0; }