poj 2002 Square
2016-05-07 11:31
204 查看
Squares
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 |
给定N个点,求出这些点一共可以构成多少个正方形。
思路:
先枚举2个点,之后算出另外两个点,判断是否符合
/* 由于我没有开个数组记录点的坐标,所以把cnt定为1005; */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int M=20007; struct node { int x,y,next; }a[20007]; int head[20007],cnt; bool cmp(node a,node b) { if(a.x==b.x) return a.y<b.y; return a.x<b.x; } void insert(int x)//进行哈希并且用链地址法解决地址冲突 { int h=(a[x].x*a[x].x+a[x].y*a[x].y)%M; a[cnt].next=head[h]; a[cnt].x=a[x].x; a[cnt].y=a[x].y; head[h]=cnt++; } int find(int x,int y) { int h=(x*x+y*y)%M; for(int i=head[h];i!=-1;i=a[i].next) { if(a[i].x==x&&a[i].y==y) return i; } return -1; } int main() { int i,j,n; while(scanf("%d",&n)&&n) { memset(head,-1,sizeof(head)); memset(a,0,sizeof(a)); cnt=1005;long long ans=0; for(i=0;i<n;i++) { scanf("%d%d",&a[i].x,&a[i].y); insert(i); } sort(a,a+n,cmp); for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { int x1=a[i].x-a[j].y+a[i].y; int y1=a[i].y+a[j].x-a[i].x; if(find(x1,y1)==-1) continue; int x2=a[j].x-a[j].y+a[i].y; int y2=a[j].y+a[j].x-a[i].x; if(find(x2,y2)==-1) continue; ans++; } } printf("%d\n",ans/2); } return 0; }
相关文章推荐
- 一张关于docker版本的图
- 实习面经--阿里 java研发 v1
- Activity生命周期图
- 表空间问题----收缩空间方法:表空间中表的查法:扩展表空间
- 2016互联网创业三大方向:反向O2O、文娱IP、生态化
- 给Linux服务器开启mysql远程访问以及防火墙规则配置
- 系统调用与标准IO库区别
- 数据结构总结文
- 第十二课程:HA下的Spark集群工作原理解密
- Cocos2d-x-3.10创建一个HelloWorld新项目
- mysql单表多timestamp的current_timestamp设置问题
- REST初体验
- 高精度总结(高精度类和重载运算高精度阶乘)
- 查找旋转数组的最小值
- Linux 查询程序安装路径 是否安装
- .NET Core RC2/RTM 明确了时间表
- Android网络编程之Apache接口
- 常用端口
- C++: 位操作
- HIHO Coder - 1299 打折机票