1. 程式人生 > >FZU Problem 2231 平行四邊形數

FZU Problem 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
分析:糾結了好半天,不知道用什麼方法做好!結果想著用一條邊相等和平行這個定理來做。但是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; }