Regular polygon

Regular polygon     


    

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.

Input
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.)
Output
For each case, output a number means how many different regular polygon these points can make.
Sample Input
4
0 0
0 1
1 0
1 1
6
0 0
0 1
1 0
1 1
2 0
2 1
Sample Output
1
2

     题意,二维平面上给N个整数点,问能构成多少个不同的正多边形。

     二维平面的正多边形只能是正方形。

     所以就是求正方形的个数,每次遍历 两个点,通过这两个点找到另外两个点,看这个点是否出现,使用哈希值把二维坐标存在一维里面,标记一下,方便后来的查找。由两个点推正方形的另外的两个点画个图就出来了。需要注意的是数据有坑,用哈希值的时候要开大一点,否则会WA。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#define maxn   40300

using namespace std;


struct Node
{
    int x,y;
}A[maxn];
map<long long,int>vis;
long long ha(int x,int y)
{
    long long key=(x+10000)*100000+y;
    return key;
}
int main()
{
    int n;
    int ans;
    while(scanf("%d",&n)!=EOF)
    {
        ans=0;
        vis.clear();
        //memset(vis,0,sizeof vis);
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&A[i].x,&A[i].y);
            vis[ha(A[i].x,A[i].y)]=1;
        }
        Node tem;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
        {
            if(i==j)
                continue;
            tem.x=A[i].x+A[i].y-A[j].y;
            tem.y=A[i].y+A[j].x-A[i].x;
            if(vis.find(ha(tem.x,tem.y))!=vis.end())
            {
                tem.x=A[j].x+A[i].y-A[j].y;
                tem.y=A[j].y+A[j].x-A[i].x;
                if(vis.find(ha(tem.x,tem.y))!=vis.end())
                    ans++;
            }
        }
        printf("%d\n",ans/4);
    }

    return 0;
}




PKU 3432 Count Squares 感觉就是这个题改了个说法,说不定测试数据都没改,毕竟代码两个题一样。。。




      

      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值