2:正方形
-
总时间限制:
- 3500ms 内存限制:
- 65536kB
-
描述
-
给定直角坐标系中的若干整点,请寻找可以由这些点组成的正方形,并统计它们的个数。
输入
- 包括多组数据,每组数据的第一行是整点的个数n(1<=n<=1000),其后n行每行由两个整数组成,表示一个点的x、y坐标。输入保证一组数据中不会出现相同的点,且坐标的绝对值小于等于20000。输入以一组n=0的数据结尾。 输出
- 对于每组输入数据,输出一个数,表示这组数据中的点可以组成的正方形的数量。 样例输入
-
4 1 0 0 1 1 1 0 0 9 0 0 1 0 2 0 0 2 1 2 2 2 0 1 1 1 2 1 4 -2 5 3 7 0 0 5 2 0
样例输出
-
1 6 1
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<iomanip> #include<queue> #include<stack> #include<vector> #include<set> #include<map> using namespace std; struct Node { int x,y; }p[1005]; int sum=0; int Hash[40005]={0}; int Next[1005]={0}; bool cmp(const Node&a,const Node&b) { if(a.x<b.x)return true; if((a.x==b.x)&&(a.y<b.y)) return true; return false; } bool Find(int x,int y) { int tmp=abs(x+y); int i=Hash[tmp]; while(i!=-1) { if((p[i].x==x)&&(p[i].y==y)) return true; i=Next[i]; } return false; } int main() { int n; while(cin>>n&&n) { memset(Hash,0xff,sizeof(Hash)); memset(Next,0xff,sizeof(Next)); for(int i=0;i<n;++i) { cin>>p[i].x>>p[i].y; } sort(p,p+n,cmp); for(int i=0;i<n;++i) { int tmp=abs(p[i].x+p[i].y); Next[i]=Hash[tmp]; Hash[tmp]=i; } sum=0; for(int i=0;i<n;++i) { for(int j=i+1;j<n;++j) { int dx=p[j].x-p[i].x; int dy=p[j].y-p[i].y; if(!Find(p[i].x+dy,p[i].y-dx)) continue; if(!Find(p[j].x+dy,p[j].y-dx)) continue; sum++; } } cout<<sum/2<<endl; } return 0; }