POJ2002-Squares
2014-07-31 18:07
288 查看
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
Source
Rocky Mountain 2004
//AC代码
Time Limit: 3500MS | Memory Limit: 65536K | |
Total Submissions: 15924 | Accepted: 6026 |
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
Source
Rocky Mountain 2004
//AC代码
/* 题意:在平面直角坐标系给出n个点,问你能组成多少个正方形 此题因为给出n是最大1000大小,所以不可能暴力(n^4) 所以我们可以退而求其次,因为是正方形如果我们知道其中两个点那么另外两个点我们自然可以求出 公式: u.x=node[i].x+(node[i].y-node[j].y); u.y=node[i].y-(node[i].x-node[j].x); v.x=node[j].x+(node[i].y-node[j].y); v.y=node[j].y-(node[i].x-node[j].x); 这样我们可以这两个点创建一个hash表来找另外两个点 */ #include<iostream> #include<queue> #include<cstdio> #include<algorithm> #include<cstring> #include<iomanip> #include<map> #include<cstdlib> #include<cmath> #include<vector> #include<set> #define LL long long #define IT __int64 #define zero(x) fabs(x)<eps #define mm(a,b) memset(a,b,sizeof(a)) const int INF=0x7fffffff; const double inf=1e8; const double eps=1e-10; const double PI=acos(-1.0); const int Max=2001; using namespace std; int sign(double x) { return (x>eps)-(x<-eps); } typedef struct Node { int x; int y; Node(const int &_x=0, const int &_y=0) : x(_x), y(_y) {} void input() { cin>>x>>y; } void output() { cout<<x<<" "<<y<<endl; } }point; point node[Max]; int hash[Max<<5]; int next[Max]; double xmult(point p0,point p1,point p2) { return(p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); } bool cmp(point u,point v) { if(u.y<v.y) return true; else if(u.y==v.y) { if(u.x<v.x) return true; } return false; } bool find(int x,int y) { int value,index; value=abs(x+y); index=hash[value]; while(index!=-1) { if(node[index].x==x&&node[index].y==y) return true; index=next[index]; } return false; } int main() { int n,m,i,j,value,index; point u,v; int sum; //freopen("D:\\in.txt","r",stdin); while(cin>>n&&n) { sum=0; //map<int,int>Map_x; //map<int,int>Map_y; for(i=0;i<n;i++) { node[i].input(); //Map_x[node[i].x]=1; //Map_y[node[i].y]=1; } //cout<<Map_x[-1]<<" "<<Map_y[-1]<<endl; memset(hash,-1,sizeof(hash)); memset(next,-1,sizeof(next)); sort(node,node+n,cmp); for(i=0;i<n;i++) { value=abs(node[i].x+node[i].y); next[i]=hash[value]; hash[value]=i; } for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { u.x=node[i].x+(node[i].y-node[j].y); u.y=node[i].y-(node[i].x-node[j].x); v.x=node[j].x+(node[i].y-node[j].y); v.y=node[j].y-(node[i].x-node[j].x); //cout<<u.x<<" "<<u.y<<" "<<v.x<<" "<<v.y<<endl; if(find(u.x,u.y)&&find(v.x,v.y)) sum+=1; } } cout<<sum/2<<endl; } return 0; }
相关文章推荐
- poj 2002 Squares (哈希+正方形已知相邻两点求另外两点的坐标)
- POJ-2002 Squares 解题报告
- poj_2002 Squares(哈希)
- POJ 2002 Squares (哈希)
- POJ 2002 Squares
- poj-2002 Squares
- poj2002 Squares
- poj 2002 Squares
- POJ-2002-Squares
- poj2002 Squares--哈希表
- POJ 2002 Squares 解题报告(哈希 开放寻址 & 链式)
- POJ 2002 Squares
- [POJ2002]Squares【平面几何】
- POJ 2002 Squares(枚举+几何)
- [POJ 2002]Squares[二分][数学]
- POJ 2002, Squares
- poj 2002 Squares
- POJ 2002 Squares 求正方形的个数,点哈希
- Hash (poj2002-Squares & poj3349-Snowflake Snow Snowflakes)
- POJ 刷题系列:2002. Squares