openjudge1807正方形题解

原题

坐标范围很大,不能开二维数组,用vector也不方便搜索(不过应该也能做,毕竟数据不多)

定义hash函数为x,y的平方和(别忘取mod)

运用一些数学原理,二重循环找正方形对角顶点坐标,由此判断另外两个顶点的坐标,并在hash表中寻找,效率非常高。

另外寻找的对角顶点不定,所以最后答案除以4。

#include
#include
#include
#include
#include
#include
using namespace std;
struct po{
	int x,y;
}a[1001];
int heade[2001],nexte[2001],px[2001],py[2001];
int t,ans,cnt;
void chushihua()
{
	ans=0,cnt=0;
	memset(heade,0,sizeof(heade));
}
void inhash(int x,int y)
{
	int k=(x*x+y*y)%2001;
	px[++cnt]=x;py[cnt]=y;
	nexte[cnt]=heade[k];
	heade[k]=cnt;
}
int fihash(int x,int y)
{
	int k=(x*x+y*y)%2001;
	int n=heade[k];
	while(n!=0)
	{
		if(px[n]==x&&py[n]==y) return 1;
		else n=nexte[n];
	}
	return 0;
}
int main()
{
	cin>>t;
	while(t!=0)
	{
		chushihua();
		for(int i=1;i<=t;++i)
		{
			cin>>a[i].x>>a[i].y;
			inhash(a[i].x,a[i].y);
		}
		for(int i=1;i<=t;++i)
		 for(int j=i+1;j<=t;++j)
		 {
		 	int x1=a[i].x-(a[i].y-a[j].y);
		 	int y1=a[i].y+(a[i].x-a[j].x);
		 	int x2=a[j].x-(a[i].y-a[j].y);
		 	int y2=a[j].y+(a[i].x-a[j].x);
		 	if(fihash(x1,y1)&&fihash(x2,y2))
		 	ans++;
		 }
		for(int i=1;i<=t;++i)
		 for(int j=i+1;j<=t;++j)
		 {
		 	int x1=a[i].x+(a[i].y-a[j].y);
		 	int y1=a[i].y-(a[i].x-a[j].x);
		 	int x2=a[j].x+(a[i].y-a[j].y);
		 	int y2=a[j].y-(a[i].x-a[j].x);
		 	if(fihash(x1,y1)&&fihash(x2,y2))
		 	ans++;
		 }
		 ans >>= 2;
		 cout<>t;
	}
	return 0;
}


你可能感兴趣的:(hash)