3102 小明爱平行四边形
小明非常喜欢平行四边形,有一天他得到了一些在二维平面内的点,现在小明想要知道从这些点里面有多少种挑法使得挑的这四个点可以组成平行四边形,保证不存在三个点在一条直线上,但是小明现在作业太多了,没有时间做这个,聪明的你可以帮助小明解决这个问题吗?
输入
第一行输入一个整数n(1 <= n <= 1000)
接下来n行,每行有两个整数,代表这个点的坐标(-10000<=坐标<=10000)
输出
输出可以组成平行四边形的方案数。
数据范围
对于10%的数据,1 <= n <= 8
对于50%的数据,1 <= n <= 1000
对于100%的数据,1 <= n <= 1000
输入样例
4
0 0
0 1
1 0
1 1
输出样例
1
样例解释
解析:
因为没有三个点在一条直线上的情况,所以我们只需要根据任意两个点相同中点的个数进行计算即可,时间复杂度为O(n^2)。
放代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include <cstring>
using namespace std;
struct lkq
{
int x;
int y;
}p[1005];
struct lkq s[1005*1005];
struct lkq mind(struct lkq a,struct lkq b)
{
struct lkq mind;
mind.x=(a.x+b.x);
mind.y=(a.y+b.y);
return mind;
}
bool cmp(struct lkq a,struct lkq b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
int main()
{
int T,n;
int c=0,ans=1;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
s[c++]=mind(p[i],p[j]);
}
}
sort(s,s+c,cmp);
int sum=0;
for(int i=0;i<c-1;i++)
{
if(s[i].x==s[i+1].x&&s[i].y==s[i+1].y)
ans++;
else
{
sum+=(ans-1)*ans/2;
ans=1;
}
}
printf("%d\n",sum);
return 0;
}