一道水题,关键是要敢做....
枚举两个点,做直线,作为正方形的一条边,然后由一条边可以确定另外的两个点。可以形成两个正方形,再用二分查找找出这两个点是否存在,若存在则方形个数++。最后答案除以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;
}