(2017多校2)1011/hdu-6055 Regular polygon(计算几何)

来源:互联网 发布:windows 8.1 远程桌面 编辑:程序博客网 时间:2024/05/21 13:59

点我看题

题意:给你n个整数点(这个条件超级重要),rang 求能组成多少个正多边形.

分析:由整数点组成的正多边形只能是正方形,可以画个图看看,发现怎么也找不到除了正四边形以外的其他形状.然后对于每一条边,分别找出它左右两边能与他形成正方形的另外两个点,然后看看这两个点是否存在.最后的答案要除以一个4,因为对于每一个正方形来说,你都通过四个边找了它四次.

参考代码:

#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<iostream>using namespace std;#define mem(a,b) memset(a,b,sizeof(a));const int maxn = 5e2+10;int n;struct Point{    int x;    int y;};Point p[maxn];bool vis[maxn][maxn];int ans;void solve( Point a, Point b){    int dx = a.x-b.x;    int dy = a.y-b.y;    if( a.x+dy >= 0 && a.y-dx >= 0 && b.x+dy >= 0 && b.y-dx >= 0 && vis[a.x+dy][a.y-dx] && vis[b.x+dy][b.y-dx])        ans++;    if( a.x-dy >= 0 && a.y+dx >= 0 && b.x-dy >= 0 && b.y+dx >= 0 && vis[a.x-dy][a.y+dx] && vis[b.x-dy][b.y+dx])        ans++;}int main(){    while( ~scanf("%d",&n))    {        mem(vis,false);        int x,y;        for( int i = 1; i <= n; i++)        {            scanf("%d%d",&x,&y);            x += 200;            y += 200;            p[i].x = x;            p[i].y = y;            vis[x][y] = 1;        }        ans = 0;        for( int i = 1; i < n; i++)            for( int j = i+1; j <= n; j++)                solve(p[i],p[j]);        printf("%d\n",ans/4);    }    return 0;}


原创粉丝点击