正方形

来源:互联网 发布:查询python版本 编辑:程序博客网 时间:2024/04/29 14:55

2:正方形

  • 查看
  • 提交
  • 统计
  • 提问
总时间限制: 
3500ms 
内存限制: 
65536kB
描述
给定直角坐标系中的若干整点,请寻找可以由这些点组成的正方形,并统计它们的个数。
输入
包括多组数据,每组数据的第一行是整点的个数n(1<=n<=1000),其后n行每行由两个整数组成,表示一个点的x、y坐标。输入保证一组数据中不会出现相同的点,且坐标的绝对值小于等于20000。输入以一组n=0的数据结尾。
输出
对于每组输入数据,输出一个数,表示这组数据中的点可以组成的正方形的数量。
样例输入
41 00 11 10 090 01 02 00 21 22 20 11 12 14-2 53 70 05 20
样例输出
161
    #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;}