1. 程式人生 > >E - Squares (POJ - 2002)

E - Squares (POJ - 2002)

stream clu ostream clas using 通過 ret for 不同

- 題目大意

有一堆平面散點集,任取四個點,求能組成正方形的不同組合方式有多少。相同的四個點,不同順序構成的正方形視為同一正方形。

- 解題思路

先枚舉兩個相鄰的點,通過數學公式得到另外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)