2017多校联合第二场 1011题 hdu 6055 Regular polygon 计算几何

来源:互联网 发布:手机内置声卡软件 编辑:程序博客网 时间:2024/06/05 09:47

题目链接


题意:

给若干个格点,问共能组成多少个正多边形


思路:

要知道一个结论,格点正多边形只有正方形(参见 https://www.zhihu.com/question/36825484/answer/69182031)

于是两两点对枚举,作为正方形的对角线,

最后 个数 / 4 即为答案


AC代码如下:

#include <cstdio>#include <cmath>#include <cstring>#define mod 1000000007#define maxn 510const double pi = 3.1415926;const double eps = 1e-6;using namespace std;typedef long long LL;char s1[maxn], s2[maxn];int kas, n, m;struct point { int x, y; }a[maxn];bool exist[maxn][maxn];int tot[maxn];int abs(int a, int b) { return a > b ? a - b : b - a; }bool ok(double x, int& y) {    if (fabs(x - floor(x)) < eps) { y = floor(x); return true; }    if (fabs(ceil(x) - x) < eps) { y = ceil(x); return true; }    return false;}void work() {    int ans = 0;    memset(exist, 0, sizeof(exist));    for (int i = 0; i < n; ++i) {        scanf("%d%d", &a[i].x, &a[i].y);        a[i].x += 100; a[i].y += 100;        exist[a[i].x][a[i].y] = true;    }    for (int i = 0; i < n; ++i) {        for (int j = 0; j < n; ++j) {            if (i == j) continue;            point p1 = a[i], p2 = a[j];            point ori = p1, ne = p2;            int dx = ne.x - ori.x, dy = ne.y - ori.y;            double midx = (double)(ori.x + ne.x) / 2, midy = (double)(ori.y + ne.y) / 2;            double hfdx = (double)(-dy) / 2, hfdy = (double)(dx) / 2;            int x1, y1, x2, y2;            double xa = midx + hfdx, ya = midy + hfdy,                xb = midx - hfdx, yb = midy - hfdy;            bool flag1 = ok(xa, x1), flag2 = ok(xb, x2),                flag3 = ok(ya, y1), flag4 = ok(yb, y2);            if (!flag1 || !flag2 || !flag3 || !flag4) continue;//          printf("%d %d %d %d\n", x1, y1, x2, y2);            if (x1 < 0 || y1 < 0 || x2 < 0 || y2 < 0) continue;            if (exist[x1][y1] && exist[x2][y2]) ++ans;        }    }    printf("%d\n", ans / 4);}int main() {    while (scanf("%d", &n) != EOF) work();    return 0;}


之后的碎碎念:

还是第一次写几何题呢0 0

不过觉得是最简单的哪种类型的了...

一开始枚举正多边形的边数,在那边用向量和矩阵旋转(想到这个的时候还觉得自己很机智((。

后来准备编几组测试数据的时候...莫名觉得好像只可能是正方形Orz


以及判断一个double型的数是不是整数也一直出了很多问题一直调不知道发生了啥...

不知道为啥下取整用强制类型转换成 int 会出问题0 0


还有就是代码风格太差劲了,

好几处用了之前用过的变量...

还忘了将exist数组给memset...


就觉得十分抱歉这样一道题写了这么久(望天

阅读全文
0 0
原创粉丝点击