HDU-6055 Regular polygon

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个点,然后看由这两个点组成的正方形的另外两个点是否存在。当时还不理解,然后这两天又重新看了一眼代码才明白其中的奥妙。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值