Description
在一个平面内给定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<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;
}