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