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;}
- POJ 2002 Square 计算几何
- POJ 2002 Squares hash/计算几何
- POJ 3304 计算几何
- POJ计算几何
- POJ 1106 计算几何
- POJ 1410 计算几何
- poj (1031) 计算几何
- POJ计算几何
- POJ计算几何
- poj计算几何
- poj 3334 计算几何
- 【转】 POJ计算几何
- poj 1106 计算几何
- poj 1329 计算几何
- poj 计算几何 分类
- POJ 3304 计算几何
- poj 1927 计算几何
- 【计算几何】POJ 1269
- HDU-1005 Number Sequence【矩阵二分幂】
- Android中的WatchDog
- HTTP POST GET 本质区别详解
- 基于C 的speex编程
- linux 2.6.32.2 mini2440平台移植--内核移植、yaffs2文件系统移植
- POJ 2002 Square 计算几何
- QTableWidget的使用和美工总结
- POJ 3660 floyd 算法
- 常用网站收藏(中文)[不断更新,收集中]
- 学习进展-2012-3-19
- poj1031---计算几何
- jQuery最基础简单的例子
- DEV控件之ASPxTextBox 的使用(验证)
- chmod permission