二分|hash(找正方形)poj2002
来源:互联网 发布:中央电视台网络春晚 编辑:程序博客网 时间:2024/05/19 23:03
Language:
Squares
Time Limit: 3500MS Memory Limit: 65536KTotal Submissions: 16255 Accepted: 6181
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.
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
41 00 11 10 090 01 02 00 21 22 20 11 12 14-2 53 70 05 20
Sample Output
161
先把点从左下角到右上角排序,然后枚举两个点,利用三角形相似算出另外两个点,看是不是存在,可以用二分,也可以hash,然后答案除以2,因为我这样算,一个正方形会被算两次
二分代码:
#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<vector>#include<cmath>#include<queue>#include<stack>#include<map>#include<set>#include<algorithm>using namespace std;const int maxn=1010;struct P{ int x,y; bool operator<(const P &a)const { if(x==a.x)return y<a.y; return x<a.x; }}p[maxn];int N;int main(){ while(scanf("%d",&N)!=EOF,N) { for(int i=1;i<=N;i++)scanf("%d%d",&p[i].x,&p[i].y); sort(p+1,p+1+N); int cnt=0; for(int i=1;i<=N;i++) { for(int j=i+1;j<=N;j++) { P tmp; tmp.x=p[i].x-p[j].y+p[i].y; tmp.y=p[i].y+p[j].x-p[i].x; if(!binary_search(p+1,p+1+N,tmp))continue; tmp.x=p[j].x-p[j].y+p[i].y; tmp.y=p[j].y+p[j].x-p[i].x; if(!binary_search(p+1,p+1+N,tmp))continue; cnt++; } } printf("%d\n",cnt/2); } return 0;}
hash:
#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<vector>#include<cmath>#include<queue>#include<stack>#include<map>#include<set>#include<algorithm>using namespace std;const int maxn=1010;const int MOD=21997;int hash[MOD],next[MOD];int N;struct P{ int x,y; bool operator<(const P &a)const { if(x==a.x)return y<a.y; return x<a.x; }}p[maxn];void insert(){ memset(hash,-1,sizeof(hash)); for(int i=1;i<=N;i++) { int tmp=(p[i].x*p[i].x+p[i].y*p[i].y)%MOD; next[i]=hash[tmp]; hash[tmp]=i; }}bool find(P tmp){ int key=(tmp.x*tmp.x+tmp.y*tmp.y)%MOD; for(int i=hash[key];i!=-1;i=next[i]) { if(tmp.x==p[i].x&&tmp.y==p[i].y)return true; } return false;}int main(){ while(scanf("%d",&N)!=EOF,N) { for(int i=1;i<=N;i++)scanf("%d%d",&p[i].x,&p[i].y); sort(p+1,p+1+N); insert(); int cnt=0; for(int i=1;i<=N;i++) { for(int j=i+1;j<=N;j++) { P tmp; tmp.x=p[i].x-p[j].y+p[i].y; tmp.y=p[i].y+p[j].x-p[i].x; if(!find(tmp))continue; tmp.x=p[j].x-p[j].y+p[i].y; tmp.y=p[j].y+p[j].x-p[i].x; if(!find(tmp))continue; cnt++; } } printf("%d\n",cnt/2); } return 0;}
0 0
- 二分|hash(找正方形)poj2002
- poj2002 数正方形 hash
- POJ2002---Squares(找正方形的个数)
- POJ2002&&POJ3432 Squares(二分||hash)
- POJ2002 Squares(hash)
- poj2002 Squares(hash)
- poj2002 hash
- poj2002——Squares(hash)
- POJ2002 正方形的个数(二维点的哈希)
- ZOJ2347 Squares (POJ2002 二分查找)
- 1414: [ZJOI2009]对称的正方形 Hash+二分
- 二分 poj2002 Squares
- POJ 2002 Squares(计算几何 找正方形 hash枚举)
- BZOJ 1414 ZJOI2009 对称的正方形 Hash+二分
- [BZOJ]1414: [ZJOI2009]对称的正方形 二分+hash
- poj2002--Squares(n个点求正方形个数)
- POJ2002-Squares-hash+枚举+几何
- HDU 6055 Regular polygon (找正方形)
- 用快速排序的思想求第K大的数或最大的k个数
- VS2010字符串相加的问题
- android调试
- Axure
- HDU 4472 Count (线性dp 推公式)
- 二分|hash(找正方形)poj2002
- Ubuntu关闭小键盘
- Android控件源码分析--AndroidResideMenu菜单
- UVA 839 - Not so Mobile
- NGUI官网示例2-interaction-讲解(一)
- 简单理解javascript中的原型对象,实现对之间共享属性和行为
- HDU 2955解题报告
- 【BZOJ3631】[JLOI2014]松鼠的新家 树链剖分
- Shell编程之函数返回值