在一个平面内给定n个点,任意三个点不在同一条直线上,用这些点可以构成多少个平行四边形?一个点可以同时属于多个平行四边形。
多组数据(<=10),处理到EOF。
每组数据第一行一个整数n(4<=n<=500)。接下来n行每行两个整数xi,yi(0<=xi,yi<=1e9),表示每个点的坐标。
每组数据输出一个整数,表示用这些点能构成多少个平行四边形。
4 0 1 1 0 1 1 2 0
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; } }