• E


    - 题目大意

         有一堆平面散点集,任取四个点,求能组成正方形的不同组合方式有多少。相同的四个点,不同顺序构成的正方形视为同一正方形。

    - 解题思路

        先枚举两个相邻的点,通过数学公式得到另外2个点,使得这四个点能够成正方形。然后检查散点集中是否存在计算出来的那两个点,若存在,说明有一个正方形。但由于在计算过程中,点枚举了两次,因此最终结果需要除以2。

    - 代码

    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct point
    {
    	int x, y;
    }p[1001];
    int n;
    
    bool f(point a, point b)
    {
    	if (a.x == b.x)
    		return a.y < b.y;
    	return a.x < b.x;
    }
    
    bool find(int x, int y)
    {
    	int l = 0, r = n-1;
    	while (r >= l)
    	{
    		int m = (l + r)/2;
    		if (p[m].x == x && p[m].y == y)
    			return 1;
    		if (p[m].x > x || (p[m].x == x && p[m].y > y))
    			r = m - 1;
    		else
    			l = m + 1;
    	}
    	return 0;
    }
    int main()
    {
    	int x, y, sum;
    	while (cin >> n)
    	{
    		if(n==0)
    			break;
    		sum = 0;
    		for (int i = 0; i < n; i++)
    			cin >> p[i].x >> p[i].y;
    		sort(p, p + n, f);
    		for (int i = 0; i < n; i++)
    		{
    			for (int j = i + 1; j < n; j++)
    			{
    				x = p[i].y - p[j].y + p[i].x;
    				y = p[j].x - p[i].x + p[i].y;
    				if (find(x, y) == 0)
    					continue;
    				x = p[i].y - p[j].y + p[j].x;
    				y = p[j].x - p[i].x + p[j].y;
    				if (find(x, y))
    					sum++;
    			}
    		}
    		cout << sum / 2 << endl;
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    火狐获取图片宽和高的方法
    JDBC连接本地sqlserver2005的方法
    war文件不在tomcat 的webapps运行
    javascript 去除空格 方法
    火狐显示图片的方法
    八款开源Android游戏引擎
    android 模拟器 hardWare 属性说明
    jqgrid 属性说明
    Java命名规范
    在MyEclipse里怎样一次性取消所有断点
  • 原文地址:https://www.cnblogs.com/alpacadh/p/8449410.html
Copyright © 2020-2023  润新知