POJ2002 &&HDU5365 判断给定的点中有多少个不同的正方形

Squares
Time Limit: 3500MS   Memory Limit: 65536K
Total Submissions: 17740   Accepted: 6776

Description

A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-degree angles. It is also a polygon such that rotating about its centre by 90 degrees gives the same polygon. It is not the only polygon with the latter property, however, as a regular octagon also has this property. 

So we all know what a square looks like, but can we find all possible squares that can be formed from a set of stars in a night sky? To make the problem easier, we will assume that the night sky is a 2-dimensional plane, and each star is specified by its x and y coordinates. 

Input

The input consists of a number of test cases. Each test case starts with the integer n (1 <= n <= 1000) indicating the number of points to follow. Each of the next n lines specify the x and y coordinates (two integers) of each point. You may assume that the points are distinct and the magnitudes of the coordinates are less than 20000. The input is terminated when n = 0.

Output

For each test case, print on a line the number of squares one can form from the given stars.

Sample Input

4
1 0
0 1
1 1
0 0
9
0 0
1 0
2 0
0 2
1 2
2 2
0 1
1 1
2 1
4
-2 5
3 7
0 0
5 2
0

Sample Output

1
6
1

题意就是给了很多点,然后要在这些点中找出正方形的数量。和HDU5365一样在于,整点是不可能构成正三角形,正五边形,正六边形的。所以题目要求的还是正四边形即正方形的个数。两道题目代码相同。

将各个点按x y排好序,之后搜索点的时候二分。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std;

struct no {
	int x;
	int y;
}node[1005];

int num;

bool cmp(const no& node1, const no& node2)
{
	if (node1.x == node2.x)
	{
		return node1.y < node2.y;
	}
	else
	{
		return node1.x < node2.x;
	}
}

bool binsearch(int x, int y)
{
	int left = -1, right = num, mid;

	while (right - left > 1)
	{
		mid = (left + right) / 2;
		if (node[mid].x == x && node[mid].y == y)
			return true;
		else
		{
			if ((node[mid].x == x && node[mid].y < y) || (x > node[mid].x))
			{
				left = mid;
			}
			else
			{
				right = mid;
			}
		}
	}
	return false;
}

int main()
{
	int i, j, pos_x1, pos_y1, pos_x2, pos_y2, ans;
	while (cin >> num)
	{
		if (num == 0)
			break;
		ans = 0;

		/*if (num <= 3)
		{
			cout << 0 << endl;
			continue;
		}之前一直WA在这里!!!*/
		for (i = 0; i < num; i++)
		{
			scanf("%d%d", &node[i].x, &node[i].y);
		}
		sort(node, node + num, cmp);

		for (i = 0; i < num; i++)
		{
			for (j = i + 1; j < num; j++)
			{
				pos_x1 = node[i].x + (node[i].y - node[j].y);
				pos_y1 = node[i].y - (node[i].x - node[j].x);

				pos_x2 = node[j].x + (node[i].y - node[j].y);
				pos_y2 = node[j].y - (node[i].x - node[j].x);

				if ((binsearch(pos_x1, pos_y1)) && (binsearch(pos_x2, pos_y2)))
					ans++;

				pos_x1 = node[i].x - (node[i].y - node[j].y);
				pos_y1 = node[i].y + (node[i].x - node[j].x);


				pos_x2 = node[j].x - (node[i].y - node[j].y);
				pos_y2 = node[j].y + (node[i].x - node[j].x);

				if ((binsearch(pos_x1, pos_y1)) && (binsearch(pos_x2, pos_y2)))
					ans++;
			}
		}
		cout << ans / 4 << endl;
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2015-09-08 20:58  光速小子  阅读(169)  评论(0编辑  收藏  举报

导航