Squares
Time Limit: 3500MS | Memory Limit: 65536K | |
Total Submissions: 11096 | Accepted: 4016 |
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.
设计的哈希函数还是一如既往的烂。。。
#include<stdio.h>
#include<string.h>
#define maxn 200001
#define maxn2 100000
#define PRIME 999993
struct point{
int x,y;
} p[maxn];
struct fuck{
int data,next;
} lin[maxn];
int ha[maxn+1];
int ans,n;
int hash(int x,int y)
{
return (x*10+y + maxn2);
}
int find(double x,double y)
{
int i,t,xx = (int)x,yy = (int)y,temp;
double t1,t2;
//printf("%lf %lf %d %d",x,y,xx,yy);
if (x != xx) return 0;
if (y != yy) return 0;
temp = hash(xx,yy);
t = ha[temp];
while (t && lin[t].data) {
//printf("^^^\n");
if ((p[lin[t].data].x == xx) && (p[lin[t].data].y == yy)) return 1;
t = lin[t].next;
}
return 0;
}
int init(void)
{
int i;
memset(lin,0,sizeof(lin));
memset(ha,0,sizeof(ha));
memset(p,0,sizeof(p));
ans = 0;
scanf("%d",&n);
for(i = 1;i <= n;i++) scanf("%d%d",&p[i].x,&p[i].y);
return n;
}
void work(void)
{
int i,temp,j,len = 1;
double x0,y0;
for(i = 1;i <= n;i++) {
temp = hash(p[i].x,p[i].y);
if (ha[temp]) {
lin[len].next = ha[temp];
lin[len].data = i;
ha[temp] = len++;
}
else {
ha[temp] = len;
lin[len].data = i;
lin[len++].next = 0;
}
}
for(i = 2;i <= n;i++)
for(j = 1;j < i;j++) {
x0 = (double)(p[i].x + p[j].x) / 2;
y0 = (double)(p[i].y + p[j].y) / 2;
//printf("%d %d %d %d %lf %lf %lf %lf\n",p[i].x,p[i].y,p[j].x,p[j].y,x0+p[i].y-y0,y0-p[i].x+x0,x0-p[i].y+y0,y0+p[i].x-x0);
if (find(x0+p[i].y-y0,y0-p[i].x+x0) && find(x0-p[i].y+y0,y0+p[i].x-x0)) ans++;
}
printf("%d\n",ans/2);
return ;
}
int main()
{
while (init()) work();
return 0;
}