zoukankan      html  css  js  c++  java
  • Squares 四边形数量,求坐标很重要

    Problem 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
    ***************************************************************************************************************************
    记着标记数组要用boolean类型
    ***************************************************************************************************************************
     1 #include<iostream>
     2 #include<string>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<queue>
     6 #include<cstdio>
     7 using namespace std;
     8 int x[1010],y[1010];
     9 bool fs[5000][5000];//此处要定义成bool类型的,否则超内存
    10 int a,b,c,i,j,sum,n;
    11 int f(int a,int b)
    12 {
    13       if(fs[a+2500][b+2500])
    14          return 1;
    15      return 0;
    16 }
    17 
    18 int main()
    19 {
    20     int x1,y1,x2,y2,x3,y3,x4,y4;
    21     int a,b,i,j,sum,n;
    22     while(scanf("%d",&n)&&n)
    23     {
    24         sum=0;
    25         memset(fs,0,sizeof(fs));
    26         for(i=0;i<n;i++)
    27         {
    28             scanf("%d %d",&a,&b);
    29             x[i]=a;
    30             y[i]=b;
    31             fs[a+2500][b+2500]=1;
    32         }
    33         for(i=0;i<n;i++)
    34         {
    35              x1=x[i];
    36              y1=y[i];
    37             for(j=0;j<i;j++)
    38             {
    39                  x2=x[j];
    40                  y2=y[j];
    41                  x3,y3,x4,y4;
    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                 x3=x1-(y1-y2);
    49                 y3=y1+(x1-x2);
    50                 x4=x2-(y1-y2);
    51                 y4=y2+(x1-x2);
    52                 if(f(x3,y3)&&f(x4,y4))
    53                   sum++;
    54             }
    55         }
    56         printf("%d
    ",sum/4);//注意此处要除以4,
    57 
    58     }
    59 }
    View Code
  • 相关阅读:
    SQL 生成可配置流水号
    安卓程序进入后台和前台的判断
    Android代码故事第一回,平均间隔的按钮
    安卓冷知识:LayoutParams
    初识Android NDK
    搬家
    LaTeX表格紧跟文字 (不影响下方文本对齐)
    FlagCounter被封杀?自己实现一个简单的多国访客计数器
    Python+OpenCV竖版古籍文字分割
    Ubuntu18.04 显卡驱动+Cuda安装踩坑记录 以及Ubuntu虚拟内存的添加
  • 原文地址:https://www.cnblogs.com/sdau--codeants/p/3389384.html
Copyright © 2011-2022 走看看