河内塔的所有状态的二进制表示

问题描述:

在略有修改的TOH中,我们有4个挂钩。所以我们总共有4^N个磁盘位置。 现在我正在经历的解决方案之一,给定的状态,使用下面的代码表示 -河内塔的所有状态的二进制表示

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

塔[光盘] ​​ - >塔盘,其中当前所在,其可以是(0,1 ,2,3)

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

能否请你解释一下上面的公式可以表示所有可能的磁盘位置,如果我们进一步转变钉的数量或N将如何改变,以让说,5

+0

您能详细说明“公式的作用”是什么意思吗?目标是找到一种使用数字编码磁盘位置的方法,反之亦然,或者通过二进制计数来解决问题? – templatetypedef

+0

@templatetypedef -goal是为了理解磁盘位置的编码以及上述方程如何工作,而不是解决问题。我想了解当N或钉的数量发生变化时,我需要如何修改给出的等式。 –

既然你只有4个钉,位置任何磁盘都可以用2位编码(00, 01, 10, 11 => 0, 1, 2, 3)。因此乘以2给出每个磁盘2个独立存储空间的整数state,其中第一个磁盘从位0开始,第二位在位2,等等...... i第012个磁盘在(i - 1) * 2。左移<<将每个磁盘的数据移动到其正确的位位置。

但是这个代码可以是“不安全” - 如果有在游戏逻辑别处错误造成的tower值比3更大,当转移它将溢出的空间其指定的2位。为了防止这种情况,做一个位与以数据为[0,3]:

state += (tower[disc] & 3) << (i * 2);

请注意,您还可以使用按位,而不是添加或 - state |= ...

从例如N = 3提供它看起来像所有板从栓4(即tower[3])开始。如果您更改为N = 5,它将再次给您4^N - 1 = 1023,因为N * 2以下的所有位都将设置为1.

+0

非常感谢@meogoesthedog。一个后续问题 - 我们在整数状态下分配了2位独立内存,然后在移动到正确位置后我们应该做(1

+1

@ G.D,因为'tower [disk]'的每个元素都是存储在这些2位空间中的数据。不知道你是怎么想出'1 meowgoesthedog

+0

假设我们有N = 3和pegs = 3。我们将再次需要2位来表示3个挂钩,所以方程保持不变。当所有光盘在最后一个塔上时[2],其状态= 42,而可能的状态总数为3^3 = 27,所以42是无效状态。什么需要改变? –