您的位置:首页 > 大数据 > 人工智能

HDU 6055 Regular polygon(计算几何+思维)——2017 Multi-University Training Contest - Team 2

2017-07-28 11:26 579 查看
传送门

Regular polygon

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1187 Accepted Submission(s): 461


[align=left]Problem Description[/align] On a two-dimensional plane, give you n integer points. Your task is to figure out how many different regular polygon these points can make.
[align=left]Input[/align] The input file consists of several test cases. Each case the first line is a numbers N (N <= 500). The next N lines ,each line contain two number Xi and Yi(-100 <= xi,yi <= 100), means the points’ position.(the data assures no two points share the same position.)
[align=left]Output[/align] For each case, output a number means how many different regular polygon these points can make.
[align=left]Sample Input[/align]
4

0 0

0 1

1 0

1 1

6

0 0

0 1

1 0

1 1

2 0

2 1

[align=left]Sample Output[/align]
1

2


题目大意:

给了 n(n≤500) 个整数点,求能构成多少个正多边形

解题思路:

首先因为是整数点,所以只能构成正四边形也就是正方形,首先想过暴力,复杂度 O(n4), 爆炸。 然后想的是 如何优化。因为是正方形,我们可以直接枚举两个点,然后判断剩余的两个点是否存在就可以了。

首先我们按照 x 坐标从小到大进行排序,然后计算另外两个点的坐标,然后判断,需要注意的是我们多算了一遍,要除以2

有一个坑点:就是将负数点转化为正数的时候,经过计算:要加上>300 的数。

代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 605;
int mp[MAXN][MAXN];
struct Point{
int x, y;
}p[MAXN];
int cmp(Point A, Point B){
if(A.x == B.x) return A.y < B.y;
return A.x < B.x;
}
int main()
{
///freopen("in.txt","r", stdin);
int n;
while(~scanf("%d", &n)){
memset(mp, 0, sizeof(mp));
for(int i=0; i<n; i++) {
int x, y;
scanf("%d%d", &x, &y);
p[i].x = (x + 300);
p[i].y = (y + 300);
mp[p[i].x][p[i].y] = 1;
}
sort(p, p+n, cmp);
int sum = 0;
for(int i=0; i<n; i++){
for(int j=i+1; j<n; j++){
int dx = p[i].x - p[j].x;
int dy = p[j].y - p[i].y;
if(mp[p[i].x+dy][p[i].y+dx] && mp[p[j].x+dy][p[j].y+dx]) sum++;
}
}
printf("%d\n",sum/2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐