• Light OJ


    Description

    There are n distinct points in the plane, given by their integer coordinates. Find the number of parallelograms whose vertices lie on these points. In other words, find the number of 4-element subsets of these points that can be written as {A, B, C, D} such that AB || CD, and BC || AD. No four points are in a straight line.

    Input

    Input starts with an integer T (≤ 15), denoting the number of test cases.

    The first line of each test case contains an integer n (1 ≤ n ≤ 1000). Each of the next n lines, contains2 space-separated integers x and y (the coordinates of a point) with magnitude (absolute value) of no more than 1000000000.

    Output

    For each case, print the case number and the number of parallelograms that can be formed.

    Sample Input
    2
    6
    0 0
    2 0
    4 0
    1 1
    3 1
    5 1
    7
    -2 -1
    8 9
    5 7
    1 1
    4 8
    2 0
    9 8
    
    Sample Output
    Case 1: 5
    Case 2: 6

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1058

    *******************************************************

    题意:给出T组实例,每组实例给出n各个点的坐标,判断能后成多少个平行四边形。

    分析:使用向量法判断,只要满足x1+x3=x2+x4,y1+y3=y2+y4,则说明可以构成平行四边行

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <stack>
     7 #include <map>
     8 #include <vector>
     9 using namespace std;
    10 
    11 #define N 1200
    12 
    13 struct node
    14 {
    15     int x,y;
    16 }p[N];
    17 
    18 node q[500000];
    19 
    20 bool cmp(node a,node b)
    21 {
    22     if(a.x==b.x)
    23         return a.y<b.y;
    24     return a.x<b.x;
    25 }
    26 
    27 int main()
    28 {
    29     int T ,kk=1,i,j,n;
    30 
    31     scanf("%d", &T);
    32 
    33     while(T--)
    34     {
    35         scanf("%d", &n);
    36 
    37         for(i=0;i<n;i++)
    38             scanf("%d%d", &p[i].x,&p[i].y);
    39 
    40         int u=0;
    41         for(i=0;i<n-1;i++)///保存好向量判断要用到的值
    42         {
    43             for(j=i+1;j<n;j++)
    44             {
    45                 q[u].x=p[i].x+p[j].x;
    46                 q[u++].y=p[i].y+p[j].y;
    47             }
    48         }
    49 
    50         sort(q,q+u,cmp);
    51 
    52         int ans=0,f=0,sum=1;
    53         for(i=1;i<u;i++)///使用向量法判定是否满足为平行四边形
    54         {
    55             if(q[i].x==q[f].x&&q[i].y==q[f].y)
    56                 sum++;
    57             else
    58             {
    59                 f=i;///
    60                 ans+=sum*(sum-1)/2;///可以构成平行四边形的数目
    61                 sum=1;
    62             }
    63         }
    64 
    65         printf("Case %d: %d
    ",kk++,ans);
    66     }
    67     return 0;
    68 }

    附上一个RE的代码:(使用的斜率和b值判断的)指出一些错误和注意事项

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <stack>
     7 #include <map>
     8 #include <vector>
     9 using namespace std;
    10 
    11 #define N 12000
    12 #define INF 0x3f3f3f3f
    13 
    14 struct node
    15 {
    16     int x,y;
    17 }p[N];
    18 
    19 struct no
    20 {
    21     double k,l,b;
    22 }q[N];///应为q[500000],对于储存统计比较条件的这个数组一定要开的更大,依旧为N的话RE无止境。。。
    23 
    24 double Len(node a,node b)
    25 {
    26     double x=b.x-a.x;
    27     double y=b.y-a.y;
    28     double len=sqrt(x*x+y*y);
    29     return len;
    30 }
    31 
    32 int main()
    33 {
    34     int T ,kk=1,i,j,n;
    35 
    36     scanf("%d", &T);
    37 
    38     while(T--)
    39     {
    40         scanf("%d", &n);
    41 
    42         memset(p,0,sizeof(p));
    43         memset(q,0,sizeof(q));
    44 
    45         for(i=0;i<n;i++)
    46             scanf("%d%d", &p[i].x,&p[i].y);
    47 
    48         int u=0;
    49         for(i=0;i<n-1;i++)
    50         {
    51             for(j=i+1;j<n;j++)
    52             {
    53                 if(p[j].x-p[i].x!=0)
    54                 {
    55                 q[u].k=1.0*(p[j].y-p[i].y)/(p[j].x-p[i].x);
    56                 q[u].b=p[i].y-q[u].k*p[i].x;
    57                 q[u++].l=Len(p[i],p[j]);
    58                 }
    59                 else
    60                 {
    61                     q[u].k=INF;
    62                     q[u].b=p[i].x;
    63                     q[u++].l=Len(p[i],p[j]);
    64                 }
    65             }
    66         }
    67 
    68         int ans=0;
    69         for(i=0;i<u-1;i++)///上面的N改了之后就知道这双重for提交,TLE妥妥的,所以这里思路必须得换一下
    70         {
    71             for(j=i+1;j<u;j++)///然后我就直接改方法了,也不知道这个路子能被改出正确答案不%>_<%
    72             {
    73                     if((q[i].k==q[j].k)&&(q[i].l==q[j].l)&&q[i].b != q[j].b)
    74                     ans++;
    75             }
    76         }
    77 
    78         printf("Case %d: %d
    ",kk++,ans/2);///这里显然也天真了
    79     }
    80     return 0;
    81 }
  • 相关阅读:
    (Toolbar)Android中如何消除Toolbar左边的空白
    (TextView)Android中为TextView赋初始值
    (Edittext)Android中界面中有多个Edittext,如何默认让第二个获取焦点
    (警告)Android中报Custom view `&#215;&#215;&#215;` has setOnTouchListener called on it but does not override performClick警告
    (Toolbar)Android中app:showASAction的值及含义
    个人课程总结
    (list)关于list清空问题的解决
    Ubuntu hive 安装过程中遇到的一些问题
    学习进度——第十七周
    个人课程总结
  • 原文地址:https://www.cnblogs.com/weiyuan/p/5770552.html
Copyright © 2020-2023  润新知