题意: 给出一些坐标点,求出能构成的正方形的个数。
题解:此题也可用二分查找。
#include <iostream>
using namespace std;
#define prime 9973
struct point
{
int x, y;
} a[1010];
struct node
{
int x, y,flag;
} hash[prime][20];
void insert( int tx, int ty )
{
int index = (tx*tx+ty*ty) % prime;
int k = 0;
while ( hash[index][k].flag != 0 ) ++k;
hash[index][k].x = tx;
hash[index][k].y = ty;
hash[index][k].flag = 1;
}
bool check ( int tx, int ty )
{
int index = (tx*tx + ty*ty) % prime;
int k = 0;
while ( hash[index][k].flag != 0 )
{
if ( hash[index][k].x == tx && hash[index][k].y == ty )
return true;
++k;
}
return false;
}
int main()
{
int n, ans, dx, dy, i, j;
while ( scanf("%d",&n) && n )
{
ans = 0;
memset(a,0,sizeof(a));
memset(hash,0,sizeof(hash));
for ( i = 0; i < n; ++i )
{
scanf("%d%d",&a[i].x,&a[i].y);
insert ( a[i].x, a[i].y );
}
for ( i = 0; i < n-1; ++i )
for ( j = i+1; j < n; ++j )
{
dx = a[i].x - a[j].x;
dy = a[i].y - a[j].y;
if ( check(a[i].x - dy, a[i].y + dx) && check(a[j].x - dy, a[j].y + dx) )
++ans;
if ( check(a[i].x + dy, a[i].y - dx) && check(a[j].x + dy, a[j].y - dx) )
++ans;
}
printf("%d\n",ans/4);
}
return 0;
}