poj2002 哈希
| Time Limit: 3500MS | Memory Limit: 65536K | |
| Total Submissions: 17666 | Accepted: 6735 |
Description
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
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
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
先枚举两个点,通过数学公式得到另外2个点,使得这四个点可以成正方形。然后检查散点集中是否存在计算出来的那两个点,若存在,说明有一个正方形。
但这样的做法会使同一个正方形依照不同的顺序被枚举了四次。因此最后的结果要除以4.
已知: (x1,y1) (x2,y2)
则: x3=x1+(y1-y2) y3= y1-(x1-x2)
x4=x2+(y1-y2) y4= y2-(x1-x2)
或
x3=x1-(y1-y2) y3= y1+(x1-x2)
x4=x2-(y1-y2) y4= y2+(x1-x2)
能够用向量坐标来证明 对角线上俩坐标已知求还有一条对角线坐标
标记点x y时,key = (x^2+y^2)%prime
解决的地址冲突的方法,我使用了 链地址法
#include<iostream> //1500K 1000MS
#include<cstdio>
#include<cstring>
#include<cmath>
#define F 19999 using namespace std; struct zuo
{
int x,y;
} p[20001];
struct node
{
int x,y;
node *next;
}*head[20001];
int n;
int KK(zuo p1)
{
int key=(p1.x*p1.x+p1.y*p1.y)%F;
return key;
}
int Build(int k) //建立
{
int key=KK(p[k]);
if(!head[key])
{
head[key]=new node;
head[key]->next=NULL;
node *q;
q=new node;
q->x=p[k].x;
q->y=p[k].y;
q->next=NULL;
head[key]->next=q;
}
else
{
node *q,*top;
top=head[key];
q=head[key]->next;
while(q)
{
q=q->next;
top=top->next;
}
q=new node;
q->next=NULL;
q->x=p[k].x;
q->y=p[k].y;
top->next=q;
}
return 0;
}
int Count(zuo p1,zuo p2) //统计
{
int key1=KK(p1);
int flag=0;
int key2=KK(p2);
if(head[key1]&&head[key2]) //推断p1,p2是否在哈希表里
{
node *q=head[key1];
while(q)
{
if(q->x==p1.x&&q->y==p1.y)
{
flag=1;
break;
}
q=q->next;
}
if(flag==0)
return 0;
else
{
node *q=head[key2];
while(q)
{
if(q->x==p2.x&&q->y==p2.y)
{
return 1;
}
q=q->next;
}
}
}
return 0;
}
int main()
{
while(~scanf("%d",&n))
{
memset(head,0,sizeof(head));
if(!n)
break;
for(int i=0; i<n; i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
Build(i);
}
int num=0;
for(int i=0; i<n; i++)
{
for(int j=i+1; j<n; j++)
{
zuo p1,p2;
p1.x=p[i].x+(p[i].y-p[j].y);
p1.y=p[i].y-(p[i].x-p[j].x);
p2.x=p[j].x+(p[i].y-p[j].y);
p2.y=p[j].y-(p[i].x-p[j].x);
num+=Count(p1,p2); p1.x=p[i].x-(p[i].y-p[j].y);
p1.y=p[i].y+(p[i].x-p[j].x);
p2.x=p[j].x-(p[i].y-p[j].y);
p2.y=p[j].y+(p[i].x-p[j].x);
num+=Count(p1,p2);
}
}
printf("%d\n",num/4);
}
}
poj2002 哈希的更多相关文章
- poj2002 数正方形 (哈希+几何)
题目传送门 题目大意:给你一堆点,问你能组成几个正方形. 思路:一开始想的是用对角线的长度来当哈希的key,但判断正方形会太复杂,然后就去找了一下正方形的判断方法,发现 已知: (x1,y1) (x2 ...
- POJ2002 二分查找&哈希
问题重述: 给定整数n,以及n个点的坐标xi, yi.求这n个点可以组成的正方形的数目(每个点可重复使用). 分析: 根据正方形的性质,给定两个点就能确定可能构成的两个正方形的另外两个顶点.因此,只需 ...
- POJ-2002 Squares,哈希模板+数学公式!
Squares 题意:二维坐标轴给出n个点求有多少个正方形. 要是平时做比赛的话毫无疑问会 ...
- [PHP内核探索]PHP中的哈希表
在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...
- java单向加密算法小结(2)--MD5哈希算法
上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...
- Java 哈希表运用-LeetCode 1 Two Sum
Given an array of integers, find two numbers such that they add up to a specific target number. The ...
- 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希
据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...
- Oracle 哈希连接原理
<基于Oracle的sql优化>里关于哈希连接的原理介绍如下: 哈希连接(HASH JOIN)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集的表连接方法. 在Oracle 7.3 ...
- SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)
今天我将介绍在SQLServer 中的三种连接操作符类型,分别是:循环嵌套.哈希匹配和合并连接.主要对这三种连接的不同.复杂度用范例的形式一一介绍. 本文中使用了示例数据库AdventureWorks ...
随机推荐
- C语言运行时数据结构
段(Segment): 对象文件/可执行文件: SVr4 UNIX上被称为ELF(起初"Extensible Linker Format", 现在"Executable ...
- 紫书 习题 11-12 UVa 1665 (并查集维护联通分量)
这道题要逆向思维 反过来从大到小枚举, 就是在矩阵中一点一点加进去数字,这样比较 好操作, 如果正着做就要一点一点删除数字, 不好做. 我们需要在这个过程中维护联通块的个数, 这里用到了并查集. 首先 ...
- react添加右键点击事件
1.在HTML里面支持contextmenu事件(右键事件).所以需要在组建加载完时添加此事件,销毁组建时移除此事件. 2. 需要增加一个state,名称为visible,用来控制菜单是否显示.在_h ...
- Inter-partition communication in multi-core processor
A multi-core processor includes logical partitions that have respective processor cores, memory area ...
- ubuntu下安装宋体simsun
sudo cp simsun.ttc /usr/share/fonts cd /usr/share/fontssudo chmod 644 simsun.ttc 更新字体缓存: 代码: sudo m ...
- Perfect Rectangle(完美矩形)
我们有 N 个与坐标轴对齐的矩形, 其中 N > 0, 判断它们是否能精确地覆盖一个矩形区域. 每个矩形用左下角的点和右上角的点的坐标来表示.例如, 一个单位正方形可以表示为 [1,1,2,2] ...
- 怎么样才算是精通 C++?
C++是一门非常奇妙的语言.让人又爱又恨. 在知乎上看到的一个帖子.怎么样才算是精通C++,这里节选一些精彩的回复. 链接:http://www.zhihu.com/question/20201972 ...
- 管理ONS(Oracle Notification Service)
Onsctl Onsctl这个命令是用来管理ONS(Oracle Notification Service)是OracleClustser实现FAN Event Push模型的基础. Oracle N ...
- 芒果TV真实视频地址解析
本文旨在互相学习,请勿滥用 若有幸被您引用请附加地址来源http://blog.csdn.net/feige2008/article/details/37579051 文章主要解析芒果TV的视频真实地 ...
- angularjs $http 服务
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...