每个雪花都有六个分支,用六个整数代表,这六个整数是从任意一个分支开始,朝顺时针或逆时针方向遍历得到的。输入多个雪花,判断是否有形状一致的雪花存在。
简单的数字哈希,要注意的是每种雪花可以由多种数字组合表示。
比如输入的是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

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

被折叠的 条评论
为什么被折叠?



