FZU Problem 2231 平行四边形数

Problem Description

在一个平面内给定n个点,任意三个点不在同一条直线上,用这些点可以构成多少个平行四边形?一个点可以同时属于多个平行四边形。
Input

多组数据(<=10),处理到EOF。

每组数据第一行一个整数n(4<=n<=500)。接下来n行每行两个整数xi,yi(0<=xi,yi<=1e9),表示每个点的坐标。
Output

每组数据输出一个整数,表示用这些点能构成多少个平行四边形。
Sample Input
4
0 1
1 0
1 1
2 0
Sample Output
1
分析:纠结了好半天,不知道用什么方法做好!结果想着用一条边相等和平行这个定理来做。但是k值不存在时不太好处理。看了解题报告,感觉别人做的很机智啊!
思路为:利用四边形的中心用对角两点来求,每两个重复的中心构成一个四边形(任意3点不在一条直线)。

#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;

struct aa
{
    int x,y;
}a1[1000];

struct bb
{
    int zx,zy;
}a2[1000];

bool cmp(bb t,bb r)
{
    if(t.zx!=r.zx)
    return t.zx<r.zx;
    else
    return t.zy<r.zy; 
}


int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int sum=0;
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&a1[i].x,&a1[i].y);
    }
    int cnt=0;
    for(int i=0;i<n-1;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            a2[cnt].zx=a1[i].x+a1[j].x;
            a2[cnt++].zy=a1[i].y+a1[j].y;
        }
    }

    sort(a2,a2+cnt,cmp);
    int num=1;
    for(int i=0;i<cnt-1;i++)
    {
        if(a2[i].zx ==a2[i+1].zx &&a2[i].zy ==a2[i+1].zy)
        num++;
        else
        {
            sum+=num*(num-1)/2;
            num=1;
        }
    }
    printf("%d\n",sum);
}
    return 0;
 } 

你可能感兴趣的:(FZU Problem 2231 平行四边形数)