• poj2002(Squares)


    题目地址:Squares

    题目大意;

         给你N个坐标顶点,通过连接各个顶点,构成正方形,问最多有多少个正方形。通过不同的顺序构成的正方形视为同一正方形。

    解题思路:

        O(n^4)超时。这时想通过两个坐标顶点是否可以查找是否构成正方形。

    通过三角形全等得:

    已知: (x1,y1)  (x2,y2)

    则:  

        x3=x1+(y1-y2)   y3= y1-(x1-x2)

        x4=x2+(y1-y2)   y4= y2-(x1-x2)

        x3=x1-(y1-y2)   y3= y1+(x1-x2)

        x4=x2-(y1-y2)   y4= y2+(x1-x2)

    通过两个坐标可以确定另外两个坐标。以为属于枚举了四个顶点,所以最后结果应该除以4.

    通过hash 将各个顶点存起来。  然后通过x1,x2,y1,y2计算出的x3,y3,x4,y4分别去判断已经存起来的顶点是否存在,如存在即可以构成。

    代码1:

    Memory: 540K   Time: 1329MS

    链表模拟拉链。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cstdlib>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 struct no
     8 {
     9     int x;
    10     int y;
    11 } node[1001];
    12 struct map
    13 {
    14     int x;
    15     int y;
    16     struct map *next;
    17 } *m[2010];
    18 int hash1(int x,int y)
    19 {
    20     int key=(x*x+y*y)%2000;
    21     if (!m[key])
    22     {
    23         map *temp=(map *)malloc(sizeof(map));
    24         temp->x=x;
    25         temp->y=y;
    26         temp->next=NULL;
    27         m[key]=temp;
    28     }
    29     else
    30     {
    31         map *temp=m[key];
    32         while(temp)
    33             temp=temp->next;
    34         temp=(map *)malloc(sizeof(map));
    35         temp->x=x;
    36         temp->y=y;
    37         temp->next=NULL;
    38     }
    39 }
    40 int find(int x,int y)
    41 {
    42     int key=(x*x+y*y)%2000;
    43     if (m[key])
    44     {
    45         map *temp=m[key];
    46         while(temp)
    47         {
    48             if (temp->x==x&&temp->y==y)
    49                 return 1;
    50             temp=temp->next;
    51         }
    52     }
    53     return 0;
    54 }
    55 int main()
    56 {
    57     int n;
    58     while(scanf("%d",&n)&&n)
    59     {
    60         int i,j,x3,y3,x4,y4,cas=0;
    61         memset(m,0,sizeof(m));
    62         for(i=0; i<n; i++)
    63         {
    64             scanf("%d%d",&node[i].x,&node[i].y);
    65             hash1(node[i].x,node[i].y);
    66         }
    67         /*
    68            (x1,y1)  (x2,y2)
    69            x3=x1+(y1-y2)   y3= y1-(x1-x2)
    70            x4=x2+(y1-y2)   y4= y2-(x1-x2)
    71            x3=x1-(y1-y2)   y3= y1+(x1-x2)
    72            x4=x2-(y1-y2)   y4= y2+(x1-x2)*/
    73         for(i=0; i<n; i++)
    74             for(j=0; j<n; j++)
    75             {
    76                 if (j==i)
    77                     continue;
    78                  x3=node[i].x+(node[j].y-node[i].y);
    79                  y3=node[i].y-(node[j].x-node[i].x);
    80                  x4=node[j].x+(node[j].y-node[i].y);
    81                  y4=node[j].y-(node[j].x-node[i].x);
    82                  if (find(x3,y3)&&find(x4,y4))
    83                      cas++;
    84                  x3=node[i].x-(node[j].y-node[i].y);
    85                  y3=node[i].y+(node[j].x-node[i].x);
    86                  x4=node[j].x-(node[j].y-node[i].y);
    87                  y4=node[j].y+(node[j].x-node[i].x);
    88                  if (find(x3,y3)&&find(x4,y4))
    89                      cas++;
    90             }
    91         printf("%d
    ",cas/4);
    92     }
    93     return 0;
    94 }
    View Code

    代码2:

    Memory: 180K   Time: 891MS

    数组模拟拉链。

      1 #include <algorithm>
      2 #include <iostream>
      3 #include <sstream>
      4 #include <cstdlib>
      5 #include <cstring>
      6 #include <cstdio>
      7 #include <string>
      8 #include <bitset>
      9 #include <vector>
     10 #include <queue>
     11 #include <stack>
     12 #include <cmath>
     13 #include <list>
     14 //#include <map>
     15 #include <set>
     16 using namespace std;
     17 /***************************************/
     18 #define ll long long
     19 #define int64 __int64
     20 /***************************************/
     21 const int INF = 0x7f7f7f7f;
     22 const double eps = 1e-8;
     23 const double PIE=acos(-1.0);
     24 const int d1x[]= {0,-1,0,1};
     25 const int d1y[]= {-1,0,1,0};
     26 const int d2x[]= {0,-1,0,1};
     27 const int d2y[]= {1,0,-1,0};
     28 const int fx[]= {-1,-1,-1,0,0,1,1,1};
     29 const int fy[]= {-1,0,1,-1,1,-1,0,1};
     30 /*vector <int>map[N];map[a].push_back(b);int len=map[v].size();*/
     31 /***************************************/
     32 void openfile()
     33 {
     34     freopen("data.in","rb",stdin);
     35     freopen("data.out","wb",stdout);
     36 }
     37 /**********************华丽丽的分割线,以上为模板部分*****************/
     38 struct Node
     39 {
     40     int x,y;
     41 } node[1001];
     42 const int M=1999;
     43 int hash[2000],next[2000];
     44 int hashcode(int x,int y)
     45 {
     46     int p=0;
     47     p=(p<<6)+(x>>6)^(x<<6);
     48     p=(p<<6)+(y>>6)^(y<<6);
     49     p%=M;
     50     if (p<0)
     51         p+=M;
     52     return p;
     53 }
     54 int cmp(int x,int y)
     55 {
     56     int p;
     57     int h=hashcode(x,y);
     58     for(p=hash[h]; p!=-1; p=next[p])
     59         if (node[p].x==x&&node[p].y==y)
     60             return 1;
     61     return 0;
     62 }
     63 int main()
     64 {
     65     int n;
     66     while(scanf("%d",&n)&&n)
     67     {
     68         int i,j;
     69         int x1,x2,x3,x4,y1,y2,y3,y4;
     70         memset(hash,-1,sizeof(hash));
     71         for(i=0; i<n; i++)
     72         {
     73             scanf("%d%d",&node[i].x,&node[i].y);
     74             int h=hashcode(node[i].x,node[i].y);
     75             next[i]=hash[h];
     76             hash[h]=i;
     77         }
     78         int cnt=0;
     79         for(i=0; i<n; i++)
     80         {
     81             for(j=i+1; j<n; j++)
     82             {
     83                 x1=node[i].x;
     84                 x2=node[j].x;
     85                 y1=node[i].y;
     86                 y2=node[j].y;
     87                 x3=x1+(y1-y2);
     88                 y3=y1-(x1-x2);
     89                 x4=x2+(y1-y2);
     90                 y4=y2-(x1-x2);
     91                 if (cmp(x3,y3)&&cmp(x4,y4))
     92                     cnt++;
     93                 x3=x1-(y1-y2);
     94                 y3=y1+(x1-x2);
     95                 x4=x2-(y1-y2);
     96                 y4=y2+(x1-x2);
     97                 if (cmp(x3,y3)&&cmp(x4,y4))
     98                     cnt++;
     99             }
    100         }
    101         printf("%d
    ",cnt/4);
    102      }
    103      return 0;
    104 }
    View Code
    屌丝终有逆袭日,*******。
  • 相关阅读:
    Gridview使用CheckBox全选与单选 Version 2
    Repeater控件第前10笔记录高亮显示
    下拉式菜单(DropDownList)连动的选择
    DataList控件显示图片要的是效果
    电容屏、电阻屏基础知识
    SIM300实现GPRS上网
    qt练习7 定时爆炸小游戏
    用 STL vector 来创建二维数组
    sim300_at命令.doc
    QT练习6 label,button创建,点击按键关闭
  • 原文地址:https://www.cnblogs.com/ZhaoPengkinghold/p/3867353.html
Copyright © 2020-2023  润新知