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.
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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。