POJ3349 重复的雪花(数字哈希)

博客介绍了如何利用数字哈希方法解决POJ3349编程题,该题要求判断输入的多个雪花形状是否重复。由于每个雪花可以有多种数字排列表示相同形状,所以在读取雪花数据时,需要将所有等效排列加入哈希表。如果遇到哈希冲突,即表明存在重复雪花,后续无需继续检查。

每个雪花都有六个分支,用六个整数代表,这六个整数是从任意一个分支开始,朝顺时针或逆时针方向遍历得到的。输入多个雪花,判断是否有形状一致的雪花存在。

简单的数字哈希,要注意的是每种雪花可以由多种数字组合表示。

比如输入的是1 2 3 4 5 6,

则2 3 4 5 6 1,3 4  5 6 1 2,……,6 5 4 3 2 1,5 4 3 2 1 6等都是相同形状的。

因此可以在读入一个雪花的时候把这些情况全部放入哈希表中,如果某次插入的时候发生冲突,则说明存在重复的雪花,并且后面的不需要再处理。

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 1200010;
const int H = 1200007;

struct Node
{
	int num[6];
	int next;
};
Node node[N];
int cur;
int hashTable[H];

void initHash()
{
	cur = 0;
	for (int i = 0; i < H; ++i) hashTable[i] = -1;
}

unsigned int getHash(int* num)
{
	unsigned int hash = 0;
	for (int i = 0; i < 6; ++i)
	{
		hash += num[i];
	}
	return hash % H;
}

bool cmp(int* num1, int* num2)
{
	for (int i = 0; i < 6; ++i)
	{
		if (num1[i] != num2[i]) return false;
	}
	return true;
}

void insertHash(int* num, unsigned int h)
{
	for (int i = 0; i < 6; ++i) node[cur].num[i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值