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

HDU-6055 Regular polygon

2017-08-09 10:48 274 查看
2017 Multi-University Training Contest - Team 2 - 1011

HDU-6055 Regular polygon

题意:

在一个二维坐标平面中,给你 n 个点,求 n 个点可以组成的正多边形个数。

思路:

首先这样的正多边形只有正方形。

然后枚举2个点,看以这两个点为正方形一条边确定另外两个点(上下可以确定两个正方形),然后判断另外两个点是否存在,因为一个正方形可以由它的4条边分别来确定,所以最后的答案要除4。具体看代码实现吧。

代码:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;

struct S
{
int x, y;
};

int main()
{
int n;
int x, y, a, b, c, d;
int ans;
S p[500 + 10];
bool vis[400 + 10][400 + 10];    /// 开这么大防止越界
while(~scanf("%d", &n))
{
memset(p, 0, sizeof(p));
memset(vis, 0, sizeof(vis));
ans = 0;
for(int i = 0; i < n; ++i)
{
scanf("%d%d", &x, &y);
x += 100;
y += 100;
p[i].x = x;
p[i].y = y;
vis[x][y] = 1;
}
for(int i = 0; i < n; ++i)
{
for(int j = i + 1; j < n; ++j)
{
x = p[i].x - p[j].x;
y = p[i].y - p[j].y;
/// 只需要判断 >=0 因为数组足够大后面不会越界
/// 这里的坐标确定用到了三角形的全等,自己画一下就可以理解
if((a = p[i].x + y) >= 0 && (b = p[i].y - x) >= 0 && (c = p[j].x + y) >= 0 && (d = p[j].y - x) >= 0 && vis[a][b]&& vis[c][d])
{
++ans;
}
if((a = p[i].x - y) >= 0 && (b = p[i].y + x) >= 0 && (c = p[j].x - y) >= 0 && (d = p[j].y + x) >= 0 && vis[a][b] && vis[c][d])
{
++ans;
}
}
}
cout << (ans / 4) << endl;
}
return 0;
}


后记:

最开始只想到了边和坐标轴平行的正方形,然后从坐标的左下角开始枚举平面的每一个点然后边长从1到200看能否组成正方形。

后来发现这样少考虑了很多边不平行坐标轴的情况。然后开始尝试四层循环枚举每个点看是不是正方形。很可惜tle。

当时队友百度了一发交上A了,方法是枚举2个点,然后看由这两个点组成的正方形的另外两个点是否存在。当时还不理解,然后这两天又重新看了一眼代码才明白其中的奥妙。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: