您的位置:首页 > 其它

解题报告——POJ 2002

2015-02-17 11:58 232 查看
Squares

Time Limit: 3500MSMemory Limit: 65536K
Total Submissions: 16908Accepted: 6425
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
-------------------------------------------------------------------
这道题的原意应该是用哈希数组解决,不过我做了将近一天还是没有AC,不是WA就是RE,等技术娴熟了再来做吧~
这道题可以用二分法来做:将点集进行排序,然后用二分法进行查找。
大致思路:按照先x后y的顺序对点集进行排序,循环选择两个点,然后计算出第三、四个点可能存在的位置,用二分法查找这样的点是否存在,若存在则计数加一。最后根据同一正方形被重复计数的次数,将计数除以相应的次数。
代码如下:
------------------------------------------------------------------


#include <cstdio>
#include <algorithm>

using namespace std;

#define N 1001

struct Node
{
int x, y;
}node
;

Node temp;

bool cmp(Node X, Node Y)
{
if(X.x == Y.x)
{
return X.y < Y.y;
}
return X.x < Y.x;
}

int main()
{
int n, sum = 0;
freopen("D:\\test.txt", "r", stdin);
while(scanf("%d", &n) != EOF && n)
{
sum = 0;
for(int i = 0; i < n; i++)
{
scanf("%d%d", &node[i].x, &node[i].y);
}
sort(node, node + n, cmp);
for(int i = 0; i < n; i++)
{
for(int j = i + 1; j < n; j++)
{
temp.x = node[j].x + node[i].y - node[j].y;
temp.y = node[j].y + node[j].x - node[i].x;
if(!binary_search(node, node + n, temp, cmp))
{
continue;
}
temp.x = node[i].x + node[i].y - node[j].y;
temp.y = node[i].y + node[j].x - node[i].x;
if(binary_search(node, node + n, temp, cmp))
{
sum++;
}
}
}
printf("%d\n", sum / 2);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: