FZU 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
Source

福州大学第十三届程序设计竞赛

题目解法:求出任意两个点的中点,因为题目中已经表明任意三个点不在一条直线上,所以中点相同的点中任选两个都能组成平行四边形。
下面是AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

struct point
{
    int x,y;
}point[500];
struct node
{
    int zx,zy;
}a[250000];

bool cmp(node p,node q)
{
    if(p.zx==q.zx)
    {
        return p.zy<q.zy;
    }
    else return p.zx<q.zx;
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&point[i].x,&point[i].y);
        }
        int cnt=0;
        for(int i=0;i<n-1;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                a[cnt].zx=point[i].x+point[j].x;
                a[cnt].zy=point[i].y+point[j].y;
                cnt++;
            }
        }
        sort(a,a+cnt,cmp);
        int sum=0;
        int num=1;
        for(int i=1;i<cnt;i++)
        {
            if(a[i].zx==a[i-1].zx&&a[i].zy==a[i-1].zy)
            {
                num++;
            }
            else
            {
                sum+=(num*(num-1)/2);
                num=1;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

你可能感兴趣的:(FZU)