Squares
Time Limit: 3500MS | Memory Limit: 65536K | |
Total Submissions: 20547 | Accepted: 7895 |
Description
A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-degree angles. It is also a polygon such that rotating about its centre by 90 degrees gives the same polygon. It is not the only polygon with the latter property, however, as a regular octagon also has this property.
So we all know what a square looks like, but can we find all possible squares that can be formed from a set of stars in a night sky? To make the problem easier, we will assume that the night sky is a 2-dimensional plane, and each star is specified by its x and y coordinates.
So we all know what a square looks like, but can we find all possible squares that can be formed from a set of stars in a night sky? To make the problem easier, we will assume that the night sky is a 2-dimensional plane, and each star is specified by its x and y coordinates.
Input
The input consists of a number of test cases. Each test case starts with the integer n (1 <= n <= 1000) indicating the number of points to follow. Each of the next n lines specify the x and y coordinates (two integers) of each point. You may assume that the points are distinct and the magnitudes of the coordinates are less than 20000. The input is terminated when n = 0.
Output
For each test case, print on a line the number of squares one can form from the given stars.
Sample Input
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
Sample Output
1 6 1
题目意思:给一些点的坐标,问最多可以构成多少个正方形。
做法:先枚举两个点,通过数学公式得到另外2个点,使得这四个点能够成正方形。然后检查散点集中是否存在计算出来的那两个点,若存在,说明有一个正方形。
但这种做法会使同一个正方形按照不同的顺序被枚举了四次,因此最后的结果要除以4.
已知: (x1,y1) (x2,y2)
则: x3=x1+(y1-y2) y3= y1-(x1-x2)
x4=x2+(y1-y2) y4= y2-(x1-x2)
或
x3=x1-(y1-y2) y3= y1+(x1-x2)
x4=x2-(y1-y2) y4= y2+(x1-x2)
具体可参照:http://blog.csdn.net/lyy289065406/article/details/6647405
代码:
/* Author:kzl */
#include <iostream>
#include <cstdio>
#include<cstring>
using namespace std;
const int prime = 100007;
int hash[prime+5];
int next[prime+5];
struct node
{
int x,y;
}nod[1005];
void insert(int x,int y,int index)//加入哈希链表中
{
int h = (x*x+y*y) % prime;//哈希函数就是平方和取余
int u = hash[h];
while(u)
{
u=next[u];
}
next[index]=hash[h];
hash[h]=index;
}
bool find(int x,int y)
{
int h = (x*x+y*y) % prime;
int u = hash[h];
while(u)
{
if(nod[u].x==x && nod[u].y==y)return true;
u=next[u];
}
return false;
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
memset(hash,0,sizeof(hash));
memset(next,0,sizeof(next));
int i,j;
for(i=1;i<=n;i++)
{
scanf("%d%d",&nod[i].x,&nod[i].y);
insert(nod[i].x,nod[i].y,i);
}
int x1,y1,x2,y2,count=0;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
x1=nod[i].x+(nod[i].y-nod[j].y);
y1=nod[i].y-(nod[i].x-nod[j].x);
x2=nod[j].x+(nod[i].y-nod[j].y);
y2=nod[j].y-(nod[i].x-nod[j].x);
if(find(x1,y1)&&find(x2,y2))count++;
x1=nod[i].x-(nod[i].y-nod[j].y);
y1=nod[i].y+(nod[i].x-nod[j].x);
x2=nod[j].x-(nod[i].y-nod[j].y);
y2=nod[j].y+(nod[i].x-nod[j].x);
if(find(x1,y1) && find(x2,y2))count++;
}
}
printf("%d\n",count/4);
}
return 0;
}