九个硬币放在一个三乘三的矩阵中 有些人面朝上,有些人面朝下。合法的举措是采取任何面朝上的硬币 将它与邻近的硬币一起反转(这不包括对角线的硬币) 邻)。任务是找到导致所有硬币的最小移动次数 面朝下。
问题可以减少到最短路径问题并使用BST解决。
我们找到9个硬币的所有可能组合,并创建UnweightedGraph
。九个硬币的每个状态(或组合)代表图中的节点。如果从u到v的合法移动,我们将节点v的边分配给u。
这是找到所有512种可能组合的算法
for (int u = 0; u < 512; u++) {
char[] node = getNode(u);
/* ..... */
}
public static char[] getNode(int index) {
char[] result = new char[9];
for (int i = 0; i < 9; i++) {
int digit = index % 2;
if (digit == 0)
result[8 - i] = 'H';
else
result[8 - i] = 'T';
index = index / 2;
}
return result;
}
这个算法是如何工作的?
我只嵌入了我无法理解的部分。如果你想我可以嵌入整个nineTailsProblem
。
答案 0 :(得分:1)
这背后的逻辑是,当迭代u = [0,512]时,u的二进制表示为你提供1
和0
s的所有可能的9位组合。
u = [0,8)的例子:
000
001
010
011
100
101
110
111
getNode
只需将这些u转换为char[]
,代表位0
H
(头部)和1
T
(尾部) )。
这为您提供最低有效位(LSB)的值:
int digit = index % 2;
并除以2
将位向右移一位,这样在下一次迭代中,您将获得第二位,第三位,第四位,依此类推:
index = index / 2;