A Variation of Hanoi Problem

这道题目来自《 具体数学:计算机科学基础(第二版) 》第一章习题中“热身题”部分的第二题:把有 N 个圆盘的塔从左边的桩柱 A 移动到右边的桩柱 B, 不允许在 A 和 B 之间直接移动 ,求最短的移动序列(每一次移动都必须是移动到中间的桩柱或者从中间的桩柱移出。较大的圆盘永远不能放在较小的圆盘的上面)。

题目图示
这道题目与“ 汉诺塔问题 ”唯一不同之处在于:不允许在 A 和 B 之间直接移动,必须通过中间的桩柱

首先,从最简单的几种情况开始观察规律(注:以下移动顺序的起点桩柱 AA 用“()(\bullet)”表示)。

  • 当只有一个圆盘时,我们需要至少移动 22 次; 移动顺序:()(\bullet) -> MM -> BB
  • 当有两个圆盘时,我们需要至少移动 88 次;假定圆盘按从小到大的尺寸分别编号为 #1#2:对于圆盘 #1 的移动顺序,有 ()(\bullet) -> MM -> BB -> MM -> AA -> MM -> BB,对于圆盘 #2 的移动顺序,有 ()(\bullet) -> MM -> BB
  • 当有三个圆盘时,我们需要至少移动 2626 次;假定圆盘按从小到大的尺寸分别编号为 #1#2#3:对于圆盘 #1 的移动顺序,有 ()(\bullet) -> MM -> BB -> MM -> AA -> MM -> BB -> MM -> AA -> MM -> BB -> MM -> AA -> MM -> BB -> MM -> AA -> MM -> BB,对于圆盘 #2 的移动顺序,有 ()(\bullet) -> MM -> BB -> MM -> AA -> MM -> BB,对于圆盘 #3 的移动顺序,有 ()(\bullet) -> MM -> BB
圆盘个数移动次数
12
28
326

到目前为止,可以看到移动次数 XnX_{n} 与圆盘的个数 NN 存在着指数的关系。另外,还可以观察到,最大的那块圆盘总是移动 22 次,即 ()(\bullet) -> MM -> BB。猜测可能存在这样的关系 Xn=αqm+2X_{n} = \alpha q^{m} + 2,其中 α>0m0\alpha > 0,m \geqslant 0。看上去这是一个等比数列,但是目前没有足够的信息进一步推断 αqm\alpha q^{m}

接下来观察两个圆盘的移动顺序:

  1. 圆盘 #1先移动到 BB,也就是 AA -> MM -> BB,这里我们把移动次数记作 X1X_{1}
  2. 圆盘 #2 移动到 MM,此时移动了 11
  3. 圆盘 #1 通过再次返回到 AA,也就是 BB -> MM -> AA,这个顺序刚好与第一次圆盘 #1 移动的顺序相反,由于移动次数与移动顺序无关,我们可以把移动次数同样记作 X1X_{1}
  4. 圆盘 #2 移动到 BB,此时移动了 11
  5. 圆盘 #1 需要从 AA 移动到 BB,这种情况如同移动只有一个圆盘的问题,则其移动次数可记作 X1X_{1}

通过上面的分析,我们可以把有两个圆盘总共移动的次数写成如下式子:

X2=X1+1+X1+1+X1=3X1+2 X_{2} = X_{1} + 1 + X_{1} + 1 + X_{1} = 3X_{1} + 2

进一步,我们可以猜测,对于任意多的圆盘 NNN1N \geqslant 1,存在:

Xn={0(n=0)3Xn1+2(n1)  \begin{equation} X_{n}=\left\{ \begin{array}{lcl} 0 & & ({n = 0}) \\ 3X_{n-1} + 2 & & ({n \geqslant 1})\ \end{array} \right. \end{equation}
把 $N - 1$ 个圆盘整体看做较小的圆盘
N1N - 1 个圆盘整体看做较小的圆盘

事实上,我们可以这样考虑这个问题:当 N>1N > 1 时,把 NN 个圆盘从 AA 移动到 BB,必然需要先把 N1N - 1 个圆盘从 AA 移动到 BB,这样第 NN 个圆盘才能移动到 MM,接下来 N1N - 1 个圆盘再从 BB 移动到 AA,这样第 NN 个圆盘才能移动到 BB,此时第 NN 个圆盘已抵达终点,而剩余的 N1N - 1 个圆盘处在 AA,那么我们最后把它们从 AA 经过 MM 移动到 BB 即可。

简言之,当 N=1N = 1 时,圆盘从 AA 经过 MM 到达 BB 总共移动了 22 次;当 N>1N > 1 时,圆盘的移动过程中存在 33N1N - 1 个圆盘从 AABB 的往返移动以及 22 次第 NN 个圆盘从 AABB 的移动。对于 N1N - 1 个圆盘,把它们当做 NN' 个圆盘的问题来处理,重复上述操作即可。最终验证了 Xn=3Xn1+2X_{n} = 3X_{n-1} + 2

最后我们对递归式 (1)(1) 进行求解:

Xn=3Xn1+2Xn+1=3Xn1+1+2=3(Xn1+1)Xn=3n1  \begin{array}{llll} \because & X_{n} & = 3X_{n-1} + 2 & \\ & X_{n} + 1 & = 3X_{n-1} + 1 + 2 & = 3(X_{n-1} + 1)\\ \therefore & X_{n} & = 3^{n} - 1 \ \end{array}
Published