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
2 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
Sample Output
56
在二维坐标上给出n个点 找出四个点组成一个平行四边形 问你能够组成几个平行四边形
我们知道四边形对角线相较于中点 而中点的横纵坐标就等于对角线两点横纵坐标和的一半 这样我们只要找出中点相同的边的数量
然后两两组合即可
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct node { int x,y; }dian[10001]; node mid[500001]; bool cmp(node a,node b) { if(a.x !=b.x ) return a.x <b.x ; else return a.y <b.y ; } int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&dian[i].x ,&dian[i].y ); } int cut=0; for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++)//把给出的点两两组合连成边 { mid[cut].x =dian[i].x +dian[j].x ;//这里没有除以2是为了避免出现小数 结果是不变的 mid[cut].y =dian[i].y+dian[j].y ; cut++; } } sort(mid,mid+cut,cmp); //排序 让中点坐标相同的排列在一起 int ans=0; int flog=0;//起点边的坐标 int sum=1;//每次在新区间开始的时候中点数为1(起点边的中点) s for(int i=1;i<cut;i++) { if(mid[flog].x ==mid[i].x&&mid[flog].y==mid[i].y ) { sum++; } else { ans=ans+sum*(sum-1)/2;//找出的边两两组合 sum=1;//初始化 flog=i;//更新新的起点 } } printf("%d\n",ans); } return 0; }