FZU Problem 2231 平行四邊形數
阿新 • • 發佈:2019-02-16
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;
}