平行四边形数

来源:互联网 发布:centos 7lnmp搭建网站 编辑:程序博客网 时间:2024/05/01 08:03


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

Input

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

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

Output

每组数据输出一个整数,表示用这些点能构成多少个平行四边形。

Sample Input
40 11 01 12 0
Sample Output
1
其实就是一个水题,平行四边形的对角线互相平分,标记任意两点之间的中点;根据标记次数求出组合方案,累加即可;
#include<iostream>#include<set>#include<cstring>#include<cstdio>#include<map>using namespace std;int main(){int n;while(~scanf("%d",&n)){ map<double,map<double,int> >mp; map<double,map<double,int> >::iterator it; map<double,int>::iterator p;  double a[505],b[505];for(int i=0;i<n;i++){cin>>a[i]>>b[i];}for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){ mp[(a[i]+a[j])/2][(b[i]+b[j])/2]++;}}int sum=0; for(it=mp.begin();it!=mp.end();it++){for(p=(it->second).begin();p!=(it->second).end();p++){int gg=p->second; sum+=gg*(gg-1)/2;}}cout<<sum<<endl;}}