POJ 2002 Square 计算几何

来源:互联网 发布:小姐威客网络兼职 编辑:程序博客网 时间:2024/04/29 01:32

一道水题,关键是要敢做....

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