2017 Multi-University Training Contest

来源:互联网 发布:汉奇中走丝编程视频 编辑:程序博客网 时间:2024/06/08 19:36

http://acm.hdu.edu.cn/showproblem.php?pid=6055


题意:

给你n个点的坐标,坐标以整型输入,问所有的点能组成多少个正多边形。

思路:

比赛的时候以为会有很多种情况,其实冷静下来想了一下,在坐标都为整数点的情况下,只有正方形这一种情况才能构成正多边形,因为其他正多边形的内角会造成别的点不是整数点。在输入点的时候处理一下,每个加100,来防止超出数组的范围。每次对于一个点,看另外的三个点是否都存在,如果都存在即存在一个正方形,因为对于每一个点都重复计算了4次,所以最后输出ans / 4。

代码:

#include <stdio.h>#include <math.h>#include <string.h>#define MAXN 1005using namespace std;bool mapp[MAXN][MAXN];struct point {    int x, y;} p[MAXN];point xuanzhuan(point a, point b) {    point c;    c.x = -(a.y - b.y) + b.x;    c.y = (a.x - b.x) + b.y;    return c;}int solve(point a, point b) {    for (int i = 0; i < 4; i++) {        point c = xuanzhuan(a, b);        a = b;        b = c;        if ((c.x >= 0 && c.x <= 200) && (c.y >= 0 && c.y <= 200)) {            if (!mapp[c.x][c.y]) {                return 0;            }        } else {            return 0;        }    }    return 1;}int main() {    int n, ans;    while (~scanf("%d", &n)) {        ans = 0;        memset(mapp, false, sizeof(mapp));        for (int i = 0; i < n; i++) {            scanf("%d %d", &p[i].x, &p[i].y);            p[i].x += 100;            p[i].y += 100;            mapp[p[i].x][p[i].y] = true;        }        for (int i = 0; i < n; i++) {            for (int j = 0; j < n; j++) {                if (i != j) {                    ans += solve(p[i], p[j]);                }            }        }        printf("%d\n", ans / 4);    }}
原创粉丝点击