汉诺塔变形问题
此文章凝聚了所有我对汉诺塔问题的理解,没有配图,在我看来,严谨的文字表达比图片更加容易理解,其实是我太懒,逃
1、汉诺塔的盘子不能直接从最左边的柱子放到最右边的柱子,而是要经过中间的柱子后,才能把盘子放到右边的柱子上,初始状态为所有的盘子都是在最左边的柱子,问把所有的盘子 转移到最右边的柱子需要的最少步骤数?
解决方案:先把除了最大的盘子的其他所有的盘子移动到右边的柱子需要 T n − 1 T_{n-1} Tn−1步数,再把最大的盘子放到中间的柱子,需要 1 1 1步,把右边的一坨盘子转移到左边的柱子需要 T n − 1 T_{n-1} Tn−1步数,然后把中间的最大的盘子移动到右边的柱子上,需要一步,最后再把左边的一坨盘子移动到右边的盘子需要 T n − 1 T_{n-1} Tn−1步,所以总共需要的步数为:
T n = 3 ∗ T n − 1 + 2 T_n = 3*T_{n-1}+2 Tn=3∗Tn−1+2
T n = 3 n − 1 T_n = 3^n-1 Tn=3n−1
2、经典的汉诺塔问题是三个柱子,现在柱子有四个,求问题的解?
解决方案:首先考虑经典的三个柱子的问题,规定如下:
- D n D_n Dn表示在三个柱子的情况下问题的解,也就是经典的汉诺塔问题的答案。
- T n T_n Tn表示在四个柱子的情况下问题的解,也就是本题的答案。
采用枚举的试探性解法,首先尝试把前面的 i i i个小的盘子在四个柱子的情况下转移到一个柱子上,需要花费 T i T_i Ti步,然后把剩下的的一坨盘子在三个柱子的模式下面转移到另一个柱子上面,花费 D n − i D_{n-i} Dn−i步,最后在四个柱子的模式下转移最后的 i i i个盘子,花费 T i T_i Ti步,所有总共花费的最小步数为:
T n = m i n 1 ≤ i < n { 2 ∗ T i + D n − i } T_n=min_{1 \le i < n} \{2*T_i+D_{n-i}\} Tn=min1≤i<n{2∗Ti+Dn−i}
然而,这只是我们基于试探法所得到的最优解,事实上,严谨来说,应该只能得到下面的不等式:
T n ≤ 2 ∗ T n − k + D k ( 0 ≤ k < n ) T_n \le 2*T_{n-k}+D_k (0 \le k <n) Tn≤2∗Tn−k+Dk(0≤k<n)
只不过后来有人证明了这个算法就是最优解,真的很强。
3、环形汉诺塔,所有的盘子的移动都必须按照顺时针的方向,比如A可以直接到C,但是C不能直接返回到A,(还是弄了张图片),求在这种规则下,盘子从 A A A到 B B B的最少移动步数,盘子从 B B B到 A A A的最少移动步数,规定如下:
- Q n Q_n Qn表示盘子移动到下一个柱子的最少移动步数
- T n T_n Tn表示盘子移动到下两个柱子的最少移动步数。
Q n Q_n Qn的解决方案:假设我要把盘子从 A A A移动到 C C C,那么我要把 n − 1 n-1 n−1个盘子从 A A A移动到 B B B,耗费 T n − 1 T_{n-1} Tn−1步数,然后再把第 n n n个盘子从 A A A移动到 C C C,需要一步,最后再把 n − 1 n-1 n−1个盘子从 B B B移动到 C C C需要 T n − 1 T_{n-1} Tn−1步,因此可以得到:
Q n = 2 ∗ T n − 1 + 1 Q_n = 2*T_{n-1}+1 Qn=2∗Tn−1+1
T n T_n Tn的解决方案:假设我要把盘子从 A A A移动到 B B B,那么我要把 n − 1 n-1 n−1个盘子从 A A A移动到 B B B,耗费 T n − 1 T_{n-1} Tn−1步数,然后再把第 n n n个盘子从 A A A移动到 C C C,需要一步,再把 n − 1 n-1 n−1个盘子从 B B B移动到 A A A需要 Q n − 1 Q_{n-1} Qn−1步,然后再把第 n n n个盘子从 C C C移动到 B B B,需要一步,最后把 n − 1 n-1 n−1个盘子从 A A A移动到 B B B需要 T n − 1 T_{n-1} Tn−1步,因此可以得到:
T n = T n − 1 + 1 + Q n − 1 + 1 + T n − 1 T_n=T_{n-1}+1+Q_{n-1}+1+T_{n-1} Tn=Tn−1+1+Qn−1+1+Tn−1
T n = Q n + Q n − 1 + 1 T_n=Q_n+Q_{n-1}+1 Tn=Qn+Qn−1+1
联立上面的两个方程可以得到:
{ Q n = 2 ∗ T n − 1 + 1 T n = Q n + Q n − 1 + 1 \begin{cases} Q_n = 2*T_{n-1}+1 \\ T_n=Q_n+Q_{n-1}+1\end{cases} {Qn=2∗Tn−1+1Tn=Qn+Qn−1+1
思想过程才是最重要的,这里求通项公式有难度,所以就直接给出结果:
Q n = ( ( 1 + 3 ) n + 1 − ( 1 − 3 ) n + 1 ) / ( 2 3 ) − 1 Q_n= \left( (1+\sqrt3)^{n+1}-(1-\sqrt3)^{n+1} \right) / (2\sqrt3)-1 Qn=((1+3)n+1−(1−3)n+1)/(23)−1
4、双重汉诺塔,此时的初始状态中柱子上的圆盘有 2 n 2n 2n个,有 n n n种不同的尺寸,每一种尺寸的圆盘有两个,如果相同尺寸的圆盘是相互不可区分的,问:把所有的盘子都移动到另一个柱子上的所需要的最少步数?规定初始盘子都在左边的柱子上。
解决方案:其实和解决经典的汉诺塔问题思路类似,先把除了最大的两个盘子的其他所有的盘子移动到中间柱子需要 A n − 1 A_{n-1} An−1步数,再把最大的两个盘子放到右边柱子,需要 2 2 2步,然后把剩下的一坨盘子转移到右边的柱子需要 A n − 1 A_{n-1} An−1步数,所以总共需要的步数为:
A n = 2 ∗ A n − 1 + 2 A_n = 2*A_{n-1}+2 An=2∗An−1+2
A n = 2 n + 1 − 2 A_n = 2^{n+1}-2 An=2n+1−2
假如一对于尺寸为 k k k的盘子恰好有 m k m_k mk个,那么也就有:
A ( m n , m n − 1 , m n − 2 , . . . , m 1 ) = 2 ∗ A ( m n − 1 , m n − 2 , . . . , m 1 ) + m n A(m_n, m_{n-1}, m_{n-2},...,m_1)=2*A(m_{n-1}, m_{n-2}, ...,m1)+m_n A(mn,mn−1,mn−2,...,m1)=2∗A(mn−1,mn−2,...,m1)+mn
另外一种双重汉诺塔:尺寸相同的两个盘子相互可以区分,转移结束后保证盘子排列结果为原来的顺序,问最少的步数?
在这里,我们同样规定在这种规则下的最优解为
B
n
B_n
Bn。
解决方案:其实思路也是差不多的,首先要把除了最大的两个盘子的其他所有的盘子移动到中间的空柱子需要 A n − 1 A_{n-1} An−1步数,然后再把尺寸为 n n n的两个盘子移动到右边的空柱子上,需要 2 2 2步,注意此时它们的顺序和原来的顺序相反,然后再把那坨不是最大的盘子移回到左边的柱子上,需要 A n − 1 A_{n-1} An−1步数,然后再把那两个尺寸为 n n n的盘子移动到中间的柱子上,需要 2 2 2步,最后再把左边的盘子移动到中间要 B n − 1 B_{n-1} Bn−1步数。所以总共的步数为:
B n = A n − 1 + 2 + A n − 1 + 2 + B n − 1 B_n=A_{n-1}+2+A_{n-1}+2+B_{n-1} Bn=An−1+2+An−1+2+Bn−1
这里有一个细节的地方,那就是转移小盘子的时候为什是 A n − 1 A_{n-1} An−1步数而不是 B n − 1 B_{n-1} Bn−1步数? 事实上,根据上面的 A n A_n An的转移规则,可以看到转移后相同尺寸大小的盘子顺序刚好是相反的,一去一回,顺序不就恰好是原来的顺序吗!并且显而易见的是 A n ≤ B n A_n \le B_n An≤Bn,因此这个方法是最优的。
B n = 2 n + 2 − 5 = 2 ∗ A n − 1 B_n=2^{n+2}-5=2*A_n-1 Bn=2n+2−5=2∗An−1
这恰好说明了,为了保证顺序,我们可以连续两次移动盘子,这样的策略的步骤数为 2 ∗ A n 2*A_n 2∗An,但是 B n B_n Bn的策略却少了一步?到底是哪一步?不妨在 n = 1 n=1 n=1的情况下看看差别。