河内塔中所有州的二元表示

时间:2017-08-14 21:23:27

标签: algorithm math bit-manipulation towers-of-hanoi

在略微修改过的TOH中,我们有4个钉子。所以反过来我们总共有4 ^ N个磁盘位置。 现在,在我正在经历的一个解决方案中,使用下面的代码表示给定状态 -

for(int disc = 0; disc < N; disc++){
        state += tower[disc]<<(disc*2);
    }

塔[圆盘] - &gt;光盘当前所在的塔,可以是(0,1,2,3)

如果我在上面的代码中使用N = 3,它给出63,即4 ^ N -1。因此公式起作用,即0-63可以表示所有64个位置。但我无法理解数学相关性。

您能解释一下上述公式如何表示所有可能的磁盘位置以及如果我们进一步更改挂钩数量或N来改变它们将如何改变。

1 个答案:

答案 0 :(得分:1)

由于您只有4个挂钩,所以任何磁盘的位置都只能以2位( static void playerEventCallbackA(void *clientData, SuperpoweredAdvancedAudioPlayerEvent event, void *value) { SuperpoweredAdvancedAudioPlayer *playerA = *((SuperpoweredAdvancedAudioPlayer **)clientData); if (event == SuperpoweredAdvancedAudioPlayerEvent_LoadSuccess) { }else if (event == SuperpoweredAdvancedAudioPlayerEvent_EOF && !playerA->looping) { *The event to notify Java for end of file takes place here. Please help to suggest any line of code or method that can notify Android when this event kicks in. Personally, I have searched online, all I found similar was an "Interface" method on java side which I have no idea about. Please help* }else if (event == SuperpoweredAdvancedAudioPlayerEvent_LoadError) { delete playerA; } } )编码。因此,乘以2给出每个磁盘在整数00, 01, 10, 11 => 0, 1, 2, 3内的2位独立存储空间,第一个磁盘从第0位开始,第二个在第2位,依此类推...... state磁盘在i。左移(i - 1) * 2将每个磁盘的数据移动到正确的位位置。

然而,这段代码可能“不安全” - 如果其他地方的游戏逻辑中出现错误,导致<<的值大于tower,那么当它移位时会溢出指定的2位空间。为了防止这种情况,按位AND将钳位数据到[0,3]:

3

请注意,您也可以使用按位OR而不是添加 - state += (tower[disc] & 3) << (i * 2);

从示例state |= ...开始,看起来所有的牌都是从第4页开始的(即N = 3)。如果您更改为tower[3],它将再次为您提供N = 5,因为4^N - 1 = 1023以下的所有位都将设为1。