http://poj.org/problem?id=1971
6
0 0
2 0
4 0
1 1
3 1
5 1
7
-2 -1
8 9
5 7
1 1
4 8
2 0
9 8
6
Description
There are n distinct points in the plane, given by their integer coordinates. Find the number of parallelograms whose vertices lie on these points. In other words, find the number of 4-element subsets of these points that can be written as {A, B, C, D} such that AB || CD, and BC || AD. No four points are in a straight line.
Input
The first line of the input contains a single integer t (1 <= t <= 10), the number of test cases. It is followed by the input data for each test case.
The first line of each test case contains an integer n (1 <= n <= 1000). Each of the next n lines, contains 2 space-separated integers x and y (the coordinates of a point) with magnitude (absolute value) of no more than 1000000000.
The first line of each test case contains an integer n (1 <= n <= 1000). Each of the next n lines, contains 2 space-separated integers x and y (the coordinates of a point) with magnitude (absolute value) of no more than 1000000000.
Output
Output should contain t lines.
Line i contains an integer showing the number of the parallelograms as described above for test case i.
Line i contains an integer showing the number of the parallelograms as described above for test case i.
Sample Input
26
0 0
2 0
4 0
1 1
3 1
5 1
7
-2 -1
8 9
5 7
1 1
4 8
2 0
9 8
Sample Output
56
Source
Tehran Sharif 2004 Preliminary
题意:
输入n个点的坐标,找出能组成多少个平行四边形。
思路:
用平行四边形的对角线交点是两对角线的中点这一性质解题(如有两条直线中点坐标相同则能组成一个平行四边形)。值得注意的是有多对直线有相同中点的情况时要算出实际的数目sum+=(ans-1)*ans/2,其中ans是满足性质直线的个数。
题意:
输入n个点的坐标,找出能组成多少个平行四边形。
思路:
用平行四边形的对角线交点是两对角线的中点这一性质解题(如有两条直线中点坐标相同则能组成一个平行四边形)。值得注意的是有多对直线有相同中点的情况时要算出实际的数目sum+=(ans-1)*ans/2,其中ans是满足性质直线的个数。
代码如下:
#include<iostream> #include<cstdio> #include<algorithm> #include <cmath> #include <cstring> #include <string> #include<sstream> #include<set> #include <cstdlib> #include<map> using namespace std; struct point { int x; int y; }p[1005]; struct point pm[1005*1005]; struct point mind(struct point a,struct point b)//记录中任意两点中点坐标 { struct point mind; mind.x=(a.x+b.x); mind.y=(a.y+b.y); return mind; } bool cmp(struct point a,struct point b) { if(a.x==b.x) return a.y<b.y; return a.x<b.x; } int main() { int T,n; cin>>T; while(T--) { int c=0,ans=1; memset(pm,0,sizeof(pm)); memset(p,0,sizeof(p)); cin>>n; for(int i=0;i<n;i++) cin>>p[i].x>>p[i].y; for(int i=0;i<n-1;i++) { for(int j=i+1;j<n;j++) { pm[c++]=mind(p[i],p[j]); } } sort(pm,pm+c,cmp); int sum=0; for(int i=0;i<c-1;i++) { if(pm[i].x==pm[i+1].x&&pm[i].y==pm[i+1].y)//有中点相同的ans++ ans++; else { sum+=(ans-1)*ans/2; // 转化为能组成的平行四边形的个数 ans=1; //初始化ans为1 } } cout<<sum<<endl; } return 0; }