poj 2002 -- Squares
2014-07-25 10:28
246 查看
Squares
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
Sample Output
View Code
Time Limit: 3500MS | Memory Limit: 65536K | |
Total Submissions: 15886 | Accepted: 6013 |
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 思路: 正方形已知两点(x1,y1),(x2,y2)求另两点坐标: x3=x1+y1-y2; y3=y1-x1+x2; x4=x2+y1-y2; y4=y2-x1+x2; x3=x1-y1+y2; y3=y1+x1-x2; x4=x2-y1+y2; y4=y2+x1-x2; 计算出坐标后可以用hash查找。用静态邻接表模拟拉链。。
/*====================================================================== * Author : kevin * Filename : Squares.cpp * Creat time : 2014-07-25 09:41 * Description : ========================================================================*/ #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #define clr(a,b) memset(a,b,sizeof(a)) #define M 20000 using namespace std; struct Node { int x,y; }node[1005]; int head[2*M+5]; struct EdgeNode{ int to,next; }; EdgeNode Edges[2*M+5]; void AddEdges(int i,int j,int cnt) { Edges[cnt].to = j; Edges[cnt].next = head[i]; head[i] = cnt; } bool judge(int x,int y) { for(int k = head[x]; k != -1; k = Edges[k].next){ if(Edges[k].to == y) return true; } return false; } int main(int argc,char *argv[]) { int n; while(scanf("%d",&n)!=EOF && n){ clr(node,0); clr(head,-1); clr(Edges,0); int k = 0; for(int i = 0; i < n; i++){ scanf("%d%d",&node[i].x,&node[i].y); AddEdges(M+node[i].x,M+node[i].y,k++); } int x1,x2,x3,x4,y1,y2,y3,y4; int cnt = 0; for(int i = 0; i < n; i++){ for(int j = i+1; j < n; j++){ x1 = node[i].x + node[i].y - node[j].y; y1 = node[i].y - node[i].x + node[j].x; x2 = node[j].x + node[i].y - node[j].y; y2 = node[j].y - node[i].x + node[j].x; if(judge(x1+M,y1+M)){ if(judge(x2+M,y2+M)){ cnt++; } } x3 = node[i].x - node[i].y + node[j].y; y3 = node[i].y + node[i].x - node[j].x; x4 = node[j].x - node[i].y + node[j].y; y4 = node[j].y + node[i].x - node[j].x; if(judge(x3+M,y3+M)){ if(judge(x4+M,y4+M)){ cnt++; } } } } printf("%d\n",cnt/4); } return 0; }
View Code
相关文章推荐
- poj 2002 Squares【HASH】POJ最快
- [POJ2002]Squares(计算几何,二分)
- POJ-2002 Squares解题报告
- POJ2002_Squares (哈希表)
- POJ 2002.Squares
- POJ-2002-Squares(hash)
- POJ 2002 Squares
- POJ 2002 Squares (已知正方形对角线两点推另外两点,STL set)
- (POJ - 2002)Squares
- POJ 2002 Squares(简单的二分)
- Squares - POJ 2002 哈希
- Squares - POJ 2002 哈希
- POJ 2002 Squares
- poj 2002 Squares(hash)
- POJ2002_Squares (哈希表)
- POJ 2002 Squares
- POJ 2002 Squares(二分)
- poj 2002 Squares
- Squares-POJ - 2002
- [POJ2002 Squares]