汉诺塔问题的一个变种
最近碰到的一个有意思的算法题。
问题定义
考虑简化的汉诺塔问题:有三个柱子1、2、3,每个柱子上只要最下面的盘子是最大的,其他盘子可以以任意顺序摆放。用尽量少的步骤将n个按顺序摆放的盘子从柱子1移到柱子3(仍为顺序摆放)。
问题分析
为了将所有盘子放到3上,需要三步:
- 将前n-1个盘子以某种顺序放到2上;
- 将第n个盘子放到3上;
- 将2上的盘子放到3上。
其中步骤1与步骤3的差别在于:步骤1中盘子是第一次从柱子1上移出,而且移出之前是排好序的;步骤3中盘子经过步骤1的摆放可能是乱序的。
下面仔细分析步骤1。假设我们现在要将盘子i从1移动到2,这时柱子2、3上没有比i更大的盘子(因为只有前i-1个被移出了),那么柱子2必须是空的。因此有递归表示: