Time Limit: 3500MS Memory Limit: 65536K
Total Submissions: 6320 Accepted: 2024
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.
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
Source
Rocky Mountain 2004
//
#include < iostream >
#include < algorithm >
using namespace std;
struct Point
{
int x;
int y;
};
struct Node
{
Node():next( 0 ){}
int x;
int y;
Node * next;
};
bool findPoint(Node hash[], int x, int y, int SIZE)
{
int key = (x * x + y * y) % SIZE;
Node * pt = & hash[key];
while (pt -> next != NULL)
{
pt = pt -> next;
if (pt -> x == x && pt -> y == y) return true ;
}
return false ;
};
int main( int argc, char * argv[])
{
const int SIZE = 33119 ;
Point pts[ 1000 ];
Node hash[SIZE];
int n;
while (cin >> n && n != 0 )
{
memset(hash, 0 , sizeof (hash));
for ( int i = 0 ; i < n; ++ i)
{
Node * pn = new Node;
scanf( " %d %d " , & pts[i].x, & pts[i].y);
pn -> x = pts[i].x;
pn -> y = pts[i].y;
int key = (pn -> x * pn -> x + pn -> y * pn -> y) % SIZE;
Node * pt = & hash[key];
while (pt -> next != NULL)pt = pt -> next;
pt -> next = pn;
}
int cnt = 0 ;
for ( int i = 0 ; i < n; ++ i)
for ( int j = i + 1 ; j < n; ++ j)
{
int x = pts[i].x - pts[j].x;
int y = pts[i].y - pts[j].y;
int x1 = pts[i].x + y;
int y1 = pts[i].y - x;
int x2 = pts[j].x + y;
int y2 = pts[j].y - x;
if (findPoint(hash,x1,y1,SIZE) && findPoint(hash,x2,y2,SIZE)) ++ cnt;
x1 = pts[i].x - y;
y1 = pts[i].y + x;
x2 = pts[j].x - y;
y2 = pts[j].y + x;
if (findPoint(hash,x1,y1,SIZE) && findPoint(hash,x2,y2,SIZE)) ++ cnt;
};
cout << (cnt >> 2 ) << endl;
}
return 0 ;
}