九尾巴游戏

时间:2016-01-31 09:07:05

标签: java graph combinations

九个硬币放在一个三乘三的矩阵中 有些人面朝上,有些人面朝下。合法的举措是采取任何面朝上的硬币 将它与邻近的硬币一起反转(这不包括对角线的硬币) 邻)。任务是找到导致所有硬币的最小移动次数 面朝下。

问题可以减少到最短路径问题并使用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

1 个答案:

答案 0 :(得分:1)

这背后的逻辑是,当迭代u = [0,512]时,u的二进制表示为你提供10 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;