Squares


Time Limit: 3500MS

 

Memory Limit: 65536K

Total Submissions: 19205

 

Accepted: 7412


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


题意:给定一些坐标,找出有几个坐标可以围成正方形;

题解:简单的哈希,存点找点,暴力任何两个点,难点是知道两个点如何找到其他两个点,还要注意每两个点都可能存在两个正方形。



#include <iostream>
#include <stdio.h>
#include <string.h>

const int maxs=2500;
int c[2500], w[2500];
bool hash[maxs<<1][maxs<<1];
int main()
{
int n, i, j, a, b, x1, x2, y1, y2;
while(scanf("%d",&n)&&n!=0)
{
memset(hash, 0, sizeof(hash));
for(i=0; i<n; i++)
{
scanf("%d%d",&c[i], &w[i]);
a=c[i];
b=w[i];
hash[maxs+a][maxs+b]=1;
}
int sum=0;
for(i=1; i<n; i++)
{
for(j=0; j<i; j++)
{
x1=c[i]+(w[i]-w[j]);
y1=w[i]-(c[i]-c[j]);
x2=c[j]+(w[i]-w[j]);
y2=w[j]-(c[i]-c[j]);
if(hash[maxs+x1][maxs+y1]&&hash[maxs+x2][maxs+y2])
sum++;
x1=c[i]-(w[i]-w[j]);
y1=w[i]+(c[i]-c[j]);
x2=c[j]-(w[i]-w[j]);
y2=w[j]+(c[i]-c[j]);
if(hash[maxs+x1][maxs+y1]&&hash[maxs+x2][maxs+y2])
sum++;
}
}
printf("%d\n",sum/4);
}
return 0;
}