4柱汉诺塔问题

  先描述一下问题强化一下本身对于问题的理解:有A,B,C三个栈,其中A中有1,2,3三个数字,由于某种原因,ABC三个栈中底部的数字必须必上面的数字大,比如现在A中有序列3、2、1,那么将A中的三个数字转移到C栈中需要多少次栈操作。

  问题的描述可以换成塔跟砝码,但是基本的意思是不变的。对于这样的问题思路如下:对于N个数字规模的问题,我们考虑到问题规模下降到N-1的规模,再探讨N-1规模问题跟N规模问题的关系。

  “将N-1个数字从A栈转移到B栈中,第N个数字从A栈转移到C栈中,再将N-1个数字从B栈转移到C栈中”------F(n) = F(n-1)*2 + 1

  现在问题多了些变化,柱子(栈)的数量变为4个,其余条件不变,递推公式应该是?

  一开始我考虑到就是“N,N-1两个数分别在AB两个栈中,其余N-2个数在C栈中”------F(n) = F(n-2)*2 + 1

  后来在网上看答案发现错的有点厉害·······将问题转换为较小规模的子问题的思路是没有问题的,子问题意味原问题从原来的状态转换成一种标志性的状态。

  初始状态为N个数字都在A栈中,终止状态应该是N个数字都在C栈中,先说一说三个栈的情况,显然要将最后一个数字移动到C栈中,必须要把前N-1个数字移动到其他栈中,但是这N-1个数字是不能存在在C栈中,这是因为这任意N-1个数字都小于N,所以这N-1个数字必须放在B栈中。那么这个中间的状态就是“A栈中一个数字N,B栈中N-1个数字,C为空”,接下来数字N移动到C中,而接下来问题就是再将N-1个数字从B栈移动到C栈。其中,数字N从栈A到C栈的整个过程中对于其他N-1个数字的操作没有任何影响。

  现在回到4栈的状态分析中,假设现在C栈为空,A栈中只有一个数字N,这个时候其余N-1个数字将分布在B D两个栈中(三个栈情况下N-1个数字一定在B栈中),这就是跟3栈问题下关键的不同,前面的递推公式错了是因为固定了N-1个数字分布的情况(N-2个数字存在于B栈,一个存在于D栈中),实际情况可能是N-2,N-3......存在于B栈中。可以设存在B D两个栈中的数字个数分别为m n. 其中 m+n = N-1.

  对于任意m, n, 其中m + n = N - 1有:

 

  “将前m个数字移动到B栈中(所有栈都可以使用,4栈模式),

   再将接下来的n个数字移动到D栈中(此时B栈被占用无法使用,3栈模式),

   将数字N移动到C栈中,

   将n个数字移动到栈C中(B栈无法使用,3栈模式),

   将m个数字移动到栈C中(4栈模式),打完收工。”

  

  设f(n)为n个数字下4栈需要移动的次数,g(n)为3栈模式下需要移动的次数,那么f(N) = f(m) + g(n) + 1 + g(n) + f(m)  = 1 + 2f(m) + 2g(n).

  其中g(n) = 2^n - 1.最少的次数自然是找到合适的m,n值使得整个表达式最小,这个应该没有什么公式。

  整个问题到此结束。