【发布时间】:2021-10-08 12:37:00
【问题描述】:
我正在为滑动拼图的每个状态分配一个哈希码。我目前拥有的代码为不同的状态返回相同的哈希码。有谁知道唯一散列滑动拼图状态的有效方法?
public int hashCode() {
int total = 2;
if(board[0][0] == -1) {
total += 9;
}
else{
total += 9 * board[0][0];
}
if(board[0][1] == 1){
total += 1;
}
else{
total += 1 * board[0][1];
}
if(board[0][2] == 2){
total += 2;
}
else{
total += 2 * board[0][2];
}
if(board[1][0] == 3){
total += 3;
}
else{
total += 3 * board[1][0];
}
if(board[1][1] == 4){
total += 4;
}
else{
total += 4 * board[1][1];
}
..等
【问题讨论】:
-
我剪掉了其余的代码来提交这篇文章,但它运行相同的逻辑
-
有多少个插槽,可能有多少种不同的状态?组合的数量很可能超过 2^32,这意味着您无法在
int hashCode()中进行完美的散列。正如 dratenik 在下面指出的那样,这通常不是问题。 -
问题中的代码建议使用 3x3 板,也可以通过使用字段内容作为按顺序读取的十进制数字的不那么雄心勃勃的方法对其进行唯一编码。这仍然适合 32 位 int(最大结果 876543210)。