poj 2002 哈希函数的设计
第一次设计哈希函数,乱YY的,哈希函数细微的不同时间差距很大啊,我交了n遍。。。
disscuss中的哈慈函数好强大。。
x,y映射到一个哈希值,有可能会有多个值具有同一哈希值,所以建立邻接表,哈希函数的目的就是让尽量少的数拥有同一个哈希值
也就是尽可能的分散,尽可能的做到一一映射,就做了这题我就感觉哈希好强大啊
这是我看别人的代码后的理解,不知道对不对
感觉是对的,因为能A题,呵呵。
题目中已知两个点(相邻),可以求出正方形的另外两个点http://iaml.is-programmer.com/posts/7923.html
已知两个点,可以得出得出另外两个点 (x1+|y1-y2|, y1+|x1-x2|),(x2+|y1-y2|,y2+|x1-x2|)。再判断另外两个点有无映射就好了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int n;
struct node
{
int x,y;
}a[1010];
struct EDGE{
int x,y,next;
}edge[222222];
int head[222222];
int tot;
int hash(int x, int y){
return ((x<<9)^y)&131071;
}
void insert(int i)
{
int key=hash(a[i].x,a[i].y);
edge[tot].x=a[i].x;
edge[tot].y=a[i].y;
edge[tot].next=head[key];
head[key]=tot++;
}
int find(int x,int y)
{
int key=hash(x,y);
for(int i=head[key];i!=-1;i=edge[i].next)
if(edge[i].x==x&&edge[i].y==y)
return i;
return -1;
}
int chang(node g,node b)
{
int i,j,t;
node c,d;
t=(g.x-b.x)*(g.y-b.y);
if(t>0||g.y==b.y) return 0;// 避免重复计算
i=abs(g.x-b.x);
j=abs(g.y-b.y);
c.x=g.x+j;
c.y=g.y+i;
d.x=b.x+j;
d.y=b.y+i;
if(find(c.x,c.y)>=0 &&find (d.x,d.y)>=0) return 1;
else return 0;
}
int main()
{
int i,j;
while(scanf("%d",&n),n)
{
memset(head,-1,sizeof(head));tot=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
insert(i);
}
int ans=0;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
if(chang(a[i],a[j])) ans++;
}
}
printf("%d\n",ans);
}
return 0;
}