http://acm.fzu.edu.cn/problem.php?pid=2231
解题思路:
找出任意两个点的中点坐标,只要按照“任意两对不相等的中点坐标相等则这四个点构成一个平行四边形”的决策计算个数即可。
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 510
struct node{
long long x,y;
}s[maxn],a[maxn*maxn];
int cmp(node p,node q)
{
if(p.x==q.x)
return p.y<q.y;
return p.x<q.x;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>s[i].x>>s[i].y;
int cnt=0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
a[cnt].x=s[i].x+s[j].x,a[cnt].y=s[i].y+s[j].y;
cnt++;
}
sort(a,a+cnt,cmp);
long long ans=0,k=1;
for(int i=1;i<cnt;i++)
{
if(a[i].x==a[i-1].x&&a[i].y==a[i-1].y)
k++;
else
{
long long res=k*(k-1)/2;
ans+=res;
k=1;
}
}
cout<<ans<<endl;
}
return 0;
}