一道水题,关键是要敢做....
枚举两个点,做直线,作为正方形的一条边,然后由一条边可以确定另外的两个点。可以形成两个正方形,再用二分查找找出这两个点是否存在,若存在则方形个数++。最后答案除以4就可以了。时间不怎么好2844ms... 等会儿多用几种方法优化一下....
#include<iostream>
#include<string.h>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
struct node
{
int x,y;
}p[1111];
bool cmp( node a,node b )
{
if( a.x==b.x )
return a.y<b.y;
return a.x<b.x;
}
int N;
bool BinarySeach( int x,int y )
{
int l=0,r=N-1,mid;
bool found=false;
while( l<=r )
{
mid=(l+r)/2;
if( p[mid].x==x )
{
found=true;
break;
}
else
{
if( p[mid].x>=x ) r=mid-1;
else l=mid+1;
}
}
if( !found ) return false;
if( p[mid].y==y )return true;
l=r=mid;
while( p[l].x==x ) l--;
while( p[r].x==x ) r++;
if( l<N-1 ) l++;
if( r>0 ) r--;
while( l<=r )
{
mid=(l+r)/2;
if( p[mid].y==y )
return true;
if( p[mid].y>=y ) r=mid-1;
else l=mid+1;
}
return false;
}
int main()
{
while( scanf("%d",&N)!=EOF,N )
{
memset( p,0,sizeof(p) );
for( int i=0;i<N;i++ )
scanf( "%d%d",&p[i].x,&p[i].y );
sort( p,p+N,cmp );
int cnt=0;
for( int i=0;i<N;i++ )
for( int j=i+1;j<N;j++ )
{
int x1,y1,x2,y2;
if( p[j].y<p[i].y)
{
x1=( abs(p[i].y-p[j].y)+p[i].x );
y1=( abs(p[i].x-p[j].x)+p[i].y );
x2=( abs(p[i].y-p[j].y)+p[j].x );
y2=( abs(p[i].x-p[j].x)+p[j].y );
//printf( "1.%d %d %d %d\n2.%d %d %d %d\n",p[i].x,p[i].y,p[j].x,p[j].y,x1,y1,x2,y2 );
if( BinarySeach( x1,y1 )&&BinarySeach( x2,y2 ) )
cnt++;
x1=( p[i].x-abs(p[i].y-p[j].y) );
y1=( p[i].y-abs(p[i].x-p[j].x) );
x2=( p[j].x-abs(p[i].y-p[j].y) );
y2=( p[j].y-abs(p[i].x-p[j].x) );
//printf( "1.%d %d %d %d\n2.%d %d %d %d\n",p[i].x,p[i].y,p[j].x,p[j].y,x1,y1,x2,y2 );
if( BinarySeach( x1,y1)&&BinarySeach( x2,y2 ) )
cnt++;
}
else
{
x1=( p[i].x+abs(p[i].y-p[j].y) );
y1=( p[i].y-abs(p[i].x-p[j].x) );
x2=( p[j].x+abs(p[i].y-p[j].y) );
y2=( p[j].y-abs(p[i].x-p[j].x) );
//printf( "1.%d %d %d %d\n2.%d %d %d %d\n",p[i].x,p[i].y,p[j].x,p[j].y,x1,y1,x2,y2 );
if( BinarySeach( x1,y1 )&&BinarySeach( x2,y2 ) )
cnt++;
x1=( p[i].x-abs(p[i].y-p[j].y) );
y1=( p[i].y+abs(p[i].x-p[j].x) );
x2=( p[j].x-abs(p[i].y-p[j].y) );
y2=( p[j].y+abs(p[i].x-p[j].x) );
//printf( "1.%d %d %d %d\n2.%d %d %d %d\n",p[i].x,p[i].y,p[j].x,p[j].y,x1,y1,x2,y2 );
if( BinarySeach( x1,y1 )&&BinarySeach( x2,y2 ) )
cnt++;
}
}
printf( "%d\n",cnt/4 );
}
return 0;
}