您的位置:首页 > 编程语言 > Go语言

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

2017-07-28 08:40 411 查看
点我看题

题意:给你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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: