Squares - poj 2002(hash)
2015-12-18 20:22
225 查看
枚举两个点作为一条边,求出正方形的另外两个点,利用hash查找另外两个点。
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
#include<stdio.h> #include<string.h> #include<stdlib.h> struct node{ int x,y; } point[1002]; struct hash{ int pos; hash* next; } hashtable[2017]; int find(int x,int y){ hash* t; int tmp=(x*x+y*y)%2017; t=&hashtable[tmp]; if(t->pos==0){ return 0; }else{ int pos=t->pos; if(point[pos].x==x&&point[pos].y==y) return 1; } while(t->next){ t=t->next; int pos=t->pos; if(point[pos].x==x&&point[pos].y==y) return 1; } return 0; } int N; int main() { scanf("%d",&N); int i,j; while(N){ memset(hashtable,0,sizeof(hashtable)); memset(point,0,sizeof(point)); for(i=1;i<=N;i++){ int x,y; scanf("%d %d",&x,&y); point[i].x=x; point[i].y=y; int t=(x*x+y*y)%2017; if(hashtable[t].pos==0){ hashtable[t].pos=i; }else{ hash* tmp=(hash*)malloc(sizeof(hash)); tmp->next=0; tmp->pos=i; tmp->next=hashtable[t].next; hashtable[t].next=tmp; } } int result=0; for(i=1;i<=N;i++){ for(j=i+1;j<=N;j++){ int x1=point[i].x+(point[j].y-point[i].y); int y1=point[i].y-(point[j].x-point[i].x); int x2=point[j].x-(point[i].y-point[j].y); int y2=point[j].y+(point[i].x-point[j].x); if(find(x1,y1)&&find(x2,y2)) result++; } } for(i=1;i<=N;i++){ for(j=i+1;j<=N;j++){ int x1=point[i].x-(point[j].y-point[i].y); int y1=point[i].y+(point[j].x-point[i].x); int x2=point[j].x+(point[i].y-point[j].y); int y2=point[j].y-(point[i].x-point[j].x); if(find(x1,y1)&&find(x2,y2)) result++; } } printf("%d\n",result/4); scanf("%d",&N); } return 0; }
Time Limit: 3500MS | Memory Limit: 65536K | |
Total Submissions: 17553 | Accepted: 6677 |
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
相关文章推荐
- UIAlertView与UIActionSheet
- ArcGIS JavaScript API 4.0 beta3 新特性
- javascript 涉及float的精确加减乘除运算
- AndroidStudio基础视频教程-整理
- linux打开文件数量的查看方法
- iOS SQLite如何连续插入多行数据
- 09 UIScrollView 、 UIPageControl
- bzoj 2768: [JLOI2010]冠军调查
- (转)Python爬虫学习笔记(2):Python正则表达式指南
- ADO.NET常用方法释义
- centos6.5 安装 MySQL5.7
- (深搜) — — hdu 1016
- ADO.NET常用方法释义
- python os.path模块
- Codeforces 306B
- Invalid standard action 错误
- 08-2 UISwitch and UIStepper
- BZOJ 1003 物流运输 长歌当哭!
- pythonchallenge(0-9)
- ROS学习笔记(三)::RVIZ::wiki::translation::catkin:一:Creating a workspace for catkin