• poj1971:Parallelogram Counting


    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. 

    Output

    Output should contain t lines. 
    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

    5
    

    6

    在二维坐标上给出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
    ",ans);
    	}
    	return 0;
     } 


  • 相关阅读:
    DeepIn系统使用和相关软件安装
    在JDK11中生成JRE11的方法
    IIS 7 中设置文件上传大小的方法
    在服务器上发布MVC5的应用
    安装了多个Oracle11g的客户端,哪个客户端的tnsnames.ora会起作用?
    配置putty或SecureCRT防止SSH连接中断
    借助FRP反向代理实现内网穿透
    你不知道的hostname命令
    Perl脚本通过Expect登陆多台设备批量执行命令并Log
    Linux内核参数配置
  • 原文地址:https://www.cnblogs.com/kingjordan/p/12027048.html
Copyright © 2020-2023  润新知