• 【2017多校训练2+计算几何+板】HDU 6055 Regular polygon


    http://acm.hdu.edu.cn/showproblem.php?pid=6055

    【题意】

    给定n个格点,问有多少个正多边形

    【思路】

    • 因为是格点,只可能是正方形
    • 枚举正方形的对角线,因为有两条对角线,最后答案要/2
    • 也可以枚举正方形的边,因为有四条边,答案要/4
    • 看当前对角线确定的正方形是否存在,用几何知识求出目标点的坐标,然后二分查找目标点是否存在

    【Accepted】

     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 }
    View Code
  • 相关阅读:
    疯狂学java的第七天
    疯狂学java的第六天
    疯狂学java的第五天
    学java的第四天
    学java的第三天
    javaSE_20_常用API(包装类丶BigInteger类丶BigDecimal类 )
    javaSE_19_常用API(String类丶StringBuffer类)
    javaSE_17_内部类丶常用的引用类型用法总结
    javaSE_15_package和import丶访问控制权限
    javaSE_14_抽象类丶接口
  • 原文地址:https://www.cnblogs.com/itcsl/p/7253078.html
Copyright © 2020-2023  润新知