您的位置:首页 > 其它

poj 2002 hash

2015-10-24 20:10 211 查看
找到两个点,算出组成正方形的另外两个点,如果都存在就true;

一直都是用这个n进制哈希方法,因为第一次遇见被它惊呆了。

1032ms

#include<iostream>
#include<map>
#include <string>
#include<algorithm>
#include<fstream>
#include<cmath>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define FORE(i,b,e) for(int i=b;i>=e;i--)
#define ms(a) memset(a,0,sizeof(a))
const int maxnum =20007;
const int key = 177;
int n;

int bp[20007];
struct NODE
{
int val,next;
}node[3000];
int p;

void init(){
FOR(i,0,maxnum-1) bp[i]=-1;
p=0;
}

struct proxy
{
int x,y;
}point[1005];

void inserthash(int x,int y){
int sum1 = x*maxnum+y;
int sum=abs(sum1%maxnum);
node[p].next=bp[sum];
node[p].val = sum1;
bp[sum]=p++;

}

bool checkproxy(int x,int y){
int sum1 = x*maxnum+y;
int sum=abs(sum1%maxnum);
for(int i=bp[sum];i!=-1;i=node[i].next){
if(sum1==node[i].val) return true;
}
return false;
}

int main()
{ /*
fstream fin("G:/1.txt");
while(fin>>n){*/
while(scanf("%d",&n),n){
init();
int sum=0;
FOR(i,1,n){
scanf("%d%d",&point[i].x,&point[i].y);/*
fin>>point[i].x>>point[i].y;*/
inserthash(point[i].x,point[i].y);
}
FOR(i,1,n){
FOR(j,i+1,n){
int a=point[j].x-point[i].x;
int b=point[j].y-point[i].y;
sum+=checkproxy(point[j].x+b,point[j].y-a)&&checkproxy(point[i].x+b,point[i].y-a);
sum+=checkproxy(point[j].x-b,point[j].y+a)&&checkproxy(point[i].x-b,point[i].y+a);
}
}
printf("%d\n",sum/4);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj hash