POJ-2002 Squares
2016-04-05 21:30
465 查看
Time Limit: 3500MS | Memory Limit: 65536K | |
Total Submissions: 18416 | Accepted: 7081 |
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
分析: 暴力枚举两点(对角线或一边),然后用hash判断另外两点是否存在,向量旋转公式为:[x*cosA-y*sinA x*sinA+y*cosA] 。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; struct POINT { int x,y; } point[1001],f[117007]; bool jud[117007]; int n,ans; void insert(int x,int y) { int k=(abs(x)*10+abs(y))%107007; while(jud[k] && (f[k].x != x || f[k].y != y)) k++; if(!jud[k]) { jud[k]=true; f[k].x=x; f[k].y=y; } } bool Find(int x,int y) { int k=(abs(x)*10+abs(y))%107007; while(jud[k] && (f[k].x != x || f[k].y != y)) k++; if(!jud[k]) return false; return true; } int main() { cin.sync_with_stdio(false); while(cin >> n && n) { ans=0; memset(jud,0,sizeof(jud)); for(int i=1;i <= n;i++) { cin>>point[i].x>>point[i].y; insert(point[i].x,point[i].y); } for(int i=1;i <= n;i++) for(int j=1;j <= n;j++) if(point[j].x > point[i].x && point[j].y > point[i].y) { int a=point[i].x,b=point[i].y,x=point[j].x,y=point[j].y; if((x-a == y-b) && Find(a,y) && Find(x,b)) ans++; int dx=b-y,dy=x-a; if(Find(x+dx,y+dy) && Find(a+dx,b+dy)) ans++; } cout<<ans<<endl; } }
相关文章推荐
- Win7环境下STAF安装STAX遇到的问题及解决方法
- c++常用特性原理解析
- linux下的网络模型
- kvm
- 学习Python
- 【转】浅谈Java中的equals和==
- 我们的团队项目
- 一天一个Java基础——对象和类
- JAVA之jdk的设置
- 屏蔽码的作用
- Android编程获取sdcard音乐文件的方法
- selenium结合sikuliX操作Flash网页
- Java入门:基础算法之检查素数
- Kafka入门学习(一)
- HDOJ 2067 小兔的棋盘(简单DP)
- java实现图的最短路径(SP)的贝尔曼福特(Bellman-Ford)算法
- Dell服务器之常用管理命令
- apache高负载性能调优
- 学习Python
- 坚持写博客