hdu_6055 : Regular polygon (2017 多校第二场 1011) 计算几何

Posted wy_2016

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu_6055 : Regular polygon (2017 多校第二场 1011) 计算几何相关的知识,希望对你有一定的参考价值。

题目链接

有个结论: 平面坐标系上,坐标为整数的情况下,n个点组成正n边形时,只可能组成正方形。

然后根据这个结论来做。

我是先把所有点按照 x为第一关键字,y为第二关键字 排序,然后枚举向量 (p[i]->p[j]) (j>i),只判断这个向量左侧可否存在两个点与它一起构成一个正方形。这样算的结果是,计数每个正方形时,它的靠右和靠下的两条边都会为ans贡献一个单位,所以最后ans要除以2。

#include<bits/stdc++.h>
using namespace std;

int n;
int vis[605][605];

struct point
{
    int x,y;
    bool operator<(const point& rhs)const
    {
        return x<rhs.x || x==rhs.x&&y<rhs.y;
    }
}p[505];

int main()
{
    while(~scanf("%d",&n))
    {
        memset(vis,0,sizeof(vis));
        int ans=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&p[i].x,&p[i].y);
            p[i].x+=300,p[i].y+=300;
            vis[p[i].x][p[i].y]=1;
        }
        sort(p,p+n);
        for(int i=0;i<n;i++)
            for(int j=i+1;j<n;j++)
            {
                point a=p[i],b=p[j];
                int dx=b.x-a.x;
                int dy=b.y-a.y;
                point c,d;
                c.x=a.x-dy,c.y=a.y+dx;
                d.x=b.x-dy,d.y=b.y+dx;
                if(vis[c.x][c.y]&&vis[d.x][d.y]) ans++;
            }
        printf("%d\n",ans/2);
    }
}

 

以上是关于hdu_6055 : Regular polygon (2017 多校第二场 1011) 计算几何的主要内容,如果未能解决你的问题,请参考以下文章

HDU 6055 17多校 Regular polygon(计算几何)

HDU 6055 Regular polygon (暴力)

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

hdu6055 Regular polygon 脑洞几何 给定n个坐标(x,y)。x,y都是整数,求有多少个正多边形。因为点都是整数点,所以只可能是正四边形。

hdu6055(求正方形个数)

2017多校Round2(hdu6045~hdu6055)