E - Squares (POJ - 2002)

Posted Alpacaddhh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了E - Squares (POJ - 2002)相关的知识,希望对你有一定的参考价值。

- 题目大意

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

- 解题思路

    先枚举两个相邻的点,通过数学公式得到另外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;
}

  

以上是关于E - Squares (POJ - 2002)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2002 Squares 数学 + 必须hash

POJ 2002 Squares (哈希)

[poj2002]Squares_hash

POJ 3347 Kadj Squares(计算几何)

POJ3347:Kadj Squares——题解

POJ3347 Kadj Squares(计算几何&区间覆盖)