zoukankan      html  css  js  c++  java
  • poj 2002 Squares 几何二分 || 哈希

    Squares
    Time Limit: 3500MS   Memory Limit: 65536K
    Total Submissions: 15137   Accepted: 5749

    Description

    A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-degree angles. It is also a polygon such that rotating about its centre by 90 degrees gives the same polygon. It is not the only polygon with the latter property, however, as a regular octagon also has this property. 

    So we all know what a square looks like, but can we find all possible squares that can be formed from a set of stars in a night sky? To make the problem easier, we will assume that the night sky is a 2-dimensional plane, and each star is specified by its x and y coordinates. 

    Input

    The input consists of a number of test cases. Each test case starts with the integer n (1 <= n <= 1000) indicating the number of points to follow. Each of the next n lines specify the x and y coordinates (two integers) of each point. You may assume that the points are distinct and the magnitudes of the coordinates are less than 20000. The input is terminated when n = 0.

    Output

    For each test case, print on a line the number of squares one can form from the given stars.

    Sample Input

    4
    1 0
    0 1
    1 1
    0 0
    9
    0 0
    1 0
    2 0
    0 2
    1 2
    2 2
    0 1
    1 1
    2 1
    4
    -2 5
    3 7
    0 0
    5 2
    0
    

    Sample Output

    1
    6
    1
    

    Source

     
     1 /*
     2 题意:给你1000个点的坐标(x,y),让你找出能
     3             构成正方形的个数。
     4 思路:由于是1000,则枚举两个点,求出相应的另外
     5 两个点的坐标。然后用二分判断是否两个点都存在。
     6 
     7 
     8 就个人而言,关键在  "求出相应的另外两个点的坐标"
     9 设两个点a1,a2;
    10 由a1为中心,逆时针旋转求出
    11 a3.x=a1.y-a2.y+a1.x;
    12 a3.y=a2.x-a1.x+a1.y;
    13 由a2为中心,顺时针旋转求出
    14 a4.x=a1.y-a2.y+a2.x;
    15 a4.y=a2.x-a1.x+a2.y;
    16 由于被计算两次,所以除2
    17 */
    18 #include<iostream>
    19 #include<stdio.h>
    20 #include<cstring>
    21 #include<cstdlib>
    22 #include<algorithm>
    23 using namespace std;
    24 
    25 typedef struct
    26 {
    27     int x,y;
    28 }node;
    29 node a[1003];
    30 bool cmp(node n1,node n2)
    31 {
    32     if( n1.x!=n2.x )
    33         return n1.x<n2.x;
    34     else return n1.y<n2.y;
    35 }
    36 bool query(int l,int r,node cur)
    37 {
    38     int mid;
    39     while(l<=r)
    40     {
    41         mid=(l+r)/2;
    42         if( a[mid].x<cur.x || (a[mid].x==cur.x&&a[mid].y<cur.y))
    43             l=mid+1;
    44         else if( a[mid].x>cur.x || ( a[mid].x==cur.x&&a[mid].y>cur.y))
    45             r=mid-1;
    46         if( a[mid].x==cur.x && a[mid].y==cur.y) return true;
    47     }
    48     return false;
    49 }
    50 int main()
    51 {
    52     int n,i,j,num;
    53     node a1,a2,a3,a4;
    54     while(scanf("%d",&n)>0)
    55     {
    56         if(n==0)break;
    57         for(i=1;i<=n;i++)
    58             scanf("%d%d",&a[i].x,&a[i].y);
    59         sort(a+1,a+1+n,cmp);
    60 
    61         for(i=1,num=0;i<n;i++)
    62         {
    63             a1=a[i];
    64             for(j=i+1;j<=n;j++)
    65             {
    66                 a2=a[j];
    67                 a3.x=a1.y-a2.y+a1.x;
    68                 a3.y=a2.x-a1.x+a1.y;
    69                 if( !query(1,n,a3)) continue;
    70                 a4.x=a1.y-a2.y+a2.x;
    71                 a4.y=a2.x-a1.x+a2.y;
    72                 if( query(1,n,a4)) num++;
    73 
    74             }
    75         }
    76         printf("%d
    ",num/2);
    77     }
    78     return 0;
    79 }

    哈希做法:

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #include<algorithm>
     6 using namespace std;
     7 
     8 const int INF = 1000;
     9 typedef struct
    10 {
    11     int x,y;
    12 }node;
    13 struct hash
    14 {
    15     int x;
    16     int y;
    17     struct hash *next;
    18 };
    19 struct hash hash_table[1003];
    20 node a[INF+3];
    21 
    22 bool cmp(node n1,node n2)
    23 {
    24     if( n1.x!=n2.x )
    25         return n1.x<n2.x;
    26     else return n1.y<n2.y;
    27 }
    28 void Insert(int x,int y)
    29 {
    30     unsigned k=(x*x+y*y)%INF;
    31     struct hash *new_hash;
    32     new_hash=(struct hash *)malloc(sizeof(struct hash));
    33     new_hash->x=x;
    34     new_hash->y=y;//build 
    35 
    36     new_hash->next=hash_table[k].next;
    37     hash_table[k].next=new_hash;
    38 }
    39 bool found(int x,int y)
    40 {
    41     unsigned k=(x*x+y*y)%INF;
    42     struct hash *new_hash;
    43     new_hash=hash_table[k].next;
    44     while(new_hash!=NULL)
    45     {
    46         if(new_hash->x==x && new_hash->y==y)break;
    47         else new_hash=new_hash->next;
    48     }
    49     if(new_hash==NULL)return false;
    50     else return true;
    51 }
    52 
    53 int main()
    54 {
    55     int n,i,j,num;
    56     node a1,a2,a3,a4;
    57     while(scanf("%d",&n)>0)
    58     {
    59         if(n==0)break;
    60         memset(hash_table,0,sizeof(hash_table));
    61         for(i=1;i<=n;i++)
    62         {
    63             scanf("%d%d",&a[i].x,&a[i].y);
    64             Insert(a[i].x,a[i].y);
    65         }
    66         sort(a+1,a+1+n,cmp);
    67 
    68         for(i=1,num=0;i<n;i++)
    69         {
    70             a1=a[i];
    71             for(j=i+1;j<=n;j++)
    72             {
    73                 a2=a[j];
    74                 a3.x=a1.y-a2.y+a1.x;
    75                 a3.y=a2.x-a1.x+a1.y;
    76                 if(!found(a3.x,a3.y))continue;
    77                 a4.x=a1.y-a2.y+a2.x;
    78                 a4.y=a2.x-a1.x+a2.y;
    79                 if(found(a4.x,a4.y)==true)
    80                     num++;
    81             }
    82         }
    83         printf("%d
    ",num/2);
    84     }
    85     return 0;
    86 }
  • 相关阅读:
    STM32 -- 硬件知识
    PCIe相关的操作命令
    [转载]PCI/PCIe基础——配置空间
    [转载]网络虚拟化中的 offload 技术:LSO/LRO、GSO/GRO、TSO/UFO、VXLAN
    [转载]TSO、UFO、GSO、LRO、GRO和RSS介绍
    Linux应用函数 -- 字符串
    初级PLC
    中断方式下进行串口通讯的正确方法
    [altium] Altium Designer2013 13.3.4 (10.1881.28608) 完美版
    32个最热CPLD-FPGA论坛
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3564375.html
Copyright © 2011-2022 走看看