zoukankan      html  css  js  c++  java
  • hdu 6055

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

    题解:容易得知只有正四边形可以使得所有的顶点为整数点。(具体证明可参考杨景钦在2017的国家队论文) 所以正解即求出所有的正四边形个数。

    枚举2个点,然后暴力判断另外2个点的位置是否存在。复杂度 N*N*logN。

    已知2个点,怎么求另外2个点,我们假设这2个点组成的边不是对角线,那么最后答案除以4即可,用向量画图推下

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 struct node{
     5     int x,y;
     6 }a[505];
     7 int vis[705][705];
     8 int sum;
     9 void check(node p,node q){
    10     int x=p.x-q.x;
    11     int y=p.y-q.y;
    12     if(p.y-x>=0&&q.y-x>=0&&p.x+y>=0&&q.x+y>=0&&vis[p.x+y][p.y-x]&&vis[q.x+y][q.y-x]) sum++;
    13     if(p.x-y>=0&&q.x-y>=0&&p.y+x>=0&&q.y+x>=0&&vis[p.x-y][p.y+x]&&vis[q.x-y][q.y+x]) sum++;
    14   
    15 }
    16 
    17 int main(){
    18     int n;
    19     while(scanf("%d",&n)!=EOF){
    20         int xx,yy;
    21         memset(vis,0,sizeof(vis));
    22         for(int i=1;i<=n;i++) {
    23             scanf("%d%d",&xx,&yy);
    24             a[i].x=xx+200;
    25             a[i].y=yy+200;
    26             vis[xx+200][yy+200]=1;
    27         }
    28          sum=0;
    29         for(int i=1;i<=n;i++){
    30             for(int j=i+1;j<=n;j++){
    31                 check(a[i],a[j]);
    32             }
    33         }
    34         cout<<sum/4<<endl;
    35     }
    36 }
  • 相关阅读:
    表的相关内容
    数据类型
    mysql入门练习
    mysql入门
    协程
    多进程
    装饰器
    网络编程
    心路历程
    gensim的使用
  • 原文地址:https://www.cnblogs.com/hhxj/p/7246752.html
Copyright © 2011-2022 走看看