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