zoukankan      html  css  js  c++  java
  • poj2002Squares(点集组成正方形数)

    链接

    可以枚举两个点,因为是正方形两外两点可以由已知求出,据说可以根据三角形全等求出下列式子,数学渣不会证。。。

    已知: (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)

    然后就可以hash或者二分做了,这里只用hash做的

    应该算是简单的hash解决冲突的应用,放一个邻接表里。

    两点需正反枚举两次,才能保证两种位置的正方形都被枚举到。

    最后的结果需要除4,因为重复枚举了。

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 #include<vector>
     7 #include<cmath>
     8 #include<queue>
     9 #include<set>
    10 using namespace std;
    11 #define N 1010
    12 #define mod 99991
    13 #define LL long long
    14 #define INF 0xfffffff
    15 const double eps = 1e-8;
    16 const double pi = acos(-1.0);
    17 const double inf = ~0u>>2;
    18 struct point
    19 {
    20     int x,y;
    21     point(int x=0,int y=0):x(x),y(y){}
    22 }p[N],o[N];
    23 int next[N],head[mod],t;
    24 void insert(int i)
    25 {
    26     int key = (p[i].x*p[i].x+p[i].y*p[i].y)%mod;
    27     next[t] = head[key];
    28     o[t].x = p[i].x;
    29     o[t].y = p[i].y;
    30     head[key] = t++;
    31 }
    32 int find(point a)
    33 {
    34     int  key = (a.x*a.x+a.y*a.y)%mod;
    35     int i;
    36     for(i = head[key] ; i!= -1 ; i = next[i])
    37     {
    38         if(o[i].x==a.x&&o[i].y == a.y) return 1;
    39     }
    40     return 0;
    41 }
    42 bool cmp(point a,point b)
    43 {
    44     if(a.x==b.x)
    45     return a.y<b.y;
    46     return a.x<b.x;
    47 }
    48 int main()
    49 {
    50     int n,i,j;
    51     while(scanf("%d",&n)&&n)
    52     {
    53         memset(head,-1,sizeof(head));
    54         t = 0;
    55         for(i = 1; i <= n; i++)
    56         {
    57             scanf("%d%d",&p[i].x,&p[i].y);
    58             insert(i);
    59         }
    60         //sort(p+1,p+n+1,cmp);
    61         int ans = 0;
    62         for(i = 1; i <= n ;i++)
    63             for(j = 1 ; j <= n; j++)
    64             {
    65                 if(i==j) continue;
    66                 point p1,p2;
    67                 p1.x = p[i].x+(p[i].y-p[j].y);
    68                 p1.y = p[i].y-(p[i].x-p[j].x);
    69                 p2.x = p[j].x+(p[i].y-p[j].y);
    70                 p2.y = p[j].y-(p[i].x-p[j].x);
    71                 if(!find(p1)) continue;
    72                 if(!find(p2)) continue;
    73                 ans++;
    74             }
    75         printf("%d
    ",ans/4);
    76     }
    77     return 0;
    View Code
  • 相关阅读:
    C#编程思路
    将字符串类型字段转为map类型字段,使用str_to_map()函数
    写hive脚本时,如果hive的过滤条件比较多。可以把过滤条件放到一个参数里。然后把参数放到过滤条件处。这样以后只需要改参数就可以了
    linux中. 路径/文件
    inner join ,left join 会导致数据发散
    如何批量按分区插入数据
    hive表添加字段后,查不出数据是咋回事?
    linux中$0的含义
    linux中的$#含义
    linux的语法
  • 原文地址:https://www.cnblogs.com/shangyu/p/3855362.html
Copyright © 2011-2022 走看看