http://acm.hdu.edu.cn/showproblem.php?pid=6055
【题意】
给定n个格点,问有多少个正多边形
【思路】
- 因为是格点,只可能是正方形
- 枚举正方形的对角线,因为有两条对角线,最后答案要/2
- 也可以枚举正方形的边,因为有四条边,答案要/4
- 看当前对角线确定的正方形是否存在,用几何知识求出目标点的坐标,然后二分查找目标点是否存在
【Accepted】
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <cmath> 5 #include<iostream> 6 #include <vector> 7 using namespace std ; 8 #define eqs 1e-9 9 struct node 10 { 11 double x , y ; 12 } p[1100] ; 13 bool cmp(node a,node b) 14 { 15 return ( a.x < b.x || ( a.x == b.x && a.y < b.y ) ) ; 16 } 17 bool judge(double x,double y,int n) 18 { 19 int low = 0 , mid , high = n-1 ; 20 while( low <= high ) 21 { 22 mid = (low + high) / 2 ; 23 if( fabs(p[mid].x-x) < eqs && fabs(p[mid].y-y) < eqs ) 24 return true ; 25 else if( p[mid].x-x > eqs || ( fabs(p[mid].x-x) < eqs && p[mid].y-y > eqs ) ) 26 high = mid - 1 ; 27 else 28 low = mid + 1 ; 29 } 30 return false ; 31 } 32 int main() 33 { 34 int n,num; 35 double x,xx,y,yy; 36 while(scanf("%d", &n)!=EOF&&n) 37 { 38 num = 0 ; 39 for(int i = 0 ; i < n ; i++) 40 { 41 cin>>p[i].x>>p[i].y; 42 } 43 sort(p,p+n,cmp) ; 44 for(int i = 0 ; i < n ; i++) 45 { 46 for(int j = i+1 ; j < n ; j++) 47 { 48 if( i == j ) continue ; 49 x = (p[i].x+p[j].x)/2 ; 50 y = (p[i].y+p[j].y)/2 ; 51 xx = p[i].x - x ; 52 yy = p[i].y - y ; 53 if( judge(x+yy,y-xx,n) && judge(x-yy,y+xx,n) ) 54 { 55 num++ ; 56 } 57 } 58 } 59 cout<<num/2<<endl; 60 } 61 return 0; 62 }