zoukankan      html  css  js  c++  java
  • Squares<哈希>

    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
    

    就是看看给出的点能组成几个正方形;
    不要四个四个的组合,想也会超时,任意两个组合,然后计算出另外两个点;
    再去查询是否存在;结果要除以4的;


     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 using namespace std;
     5 bool x[5000][5000];//我才不告诉你其实数据是-2000--2000
     6 int si[1010],sj[1010];
     7 int f(int a,int b)
     8 {
     9     if(x[a+2500][b+2500])
    10         return 1;
    11     return 0;
    12 }
    13 int main()
    14 {
    15     int a,b,i,j,n,sum;
    16     int x1,y1,x2,y2,x3,y3,x4,y4;
    17     while(scanf("%d",&n)&&n)
    18     {
    19         sum=0;
    20         memset(x,0,sizeof(x));
    21         for(i=0; i<n; i++)
    22         {
    23             scanf("%d %d",&a,&b);
    24             si[i]=a;
    25             sj[i]=b;
    26             x[a+2500][b+2500]=1;
    27         }
    28         for(i=1; i<n; i++)
    29         {
    30             x1=si[i];
    31             y1=sj[i];
    32             for(j=0; j<i; j++)
    33             {
    34                 x2=si[j];
    35                 y2=sj[j];
    36                 x3=x1+(y1-y2);//计算剩下两个点
    37                 y3= y1-(x1-x2);
    38                 x4=x2+(y1-y2);
    39                 y4= y2-(x1-x2);
    40                 if(f(x3,y3)&&f(x4,y4))
    41                     sum++;
    42                 x3=x1-(y1-y2);
    43                 y3= y1+(x1-x2);
    44                 x4=x2-(y1-y2);
    45                 y4= y2+(x1-x2);
    46                 if(f(x3,y3)&&f(x4,y4))
    47                     sum++;
    48             }
    49         }
    50         printf("%d
    ",sum/4);//记得除以4
    51     }
    52     return 0;
    53 }
    View Code
  • 相关阅读:
    Java8性能优化之字符串拼接
    Java8字符串分割的几种方式及性能比较
    【Collections:集合工具类:常用方法】
    【ArrayList嵌套HashMap】
    【集合工具类:Collections】
    【HashMap 嵌套 HashMap】
    【HashMap 嵌套 ArrayList】
    【TreeMapDemo】
    【LinkedHashMap】
    【TreeMap】
  • 原文地址:https://www.cnblogs.com/kongkaikai/p/3272879.html
Copyright © 2011-2022 走看看