正方形

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;
    }


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值