1820. Hanoi Tower II

Fifnmar

[EOJ 1820] Hanoi Tower II

这里额外规定了移动的方向。

我们把三柱子分别称为 $A, B, C$。设 $f(i)$ 表示把 $i$ 个盘从 $A$ 移到 $B$ 的最小移动次数,$g(i)$ 表示把 $i$ 个盘从 $A$ 移到 $C$ 的最小移动次数。注意 $g(i)\ne 2f(i-1)+1$(先把上面的盘子移到中间柱,再把底盘移到 $C$,再把其它盘子移过来),因为当有盘子在中间柱子上的时候,底盘是移动不了的。

首先对 $f(i)$ 来说没什么变化:
$$
f(i) = 2g(i-1) + 1
$$

对 $g(i)$ 的移动思路如下:

  1. 把 $i-1$ 个盘子移到 $C$ 上,只有这样才能移动底盘。
  2. 把底盘移到 $B$ 上。
  3. 把 $i-1$ 个盘子移到 $A$ 上,只有这样才能再次移动底盘。
  4. 把底盘移到 $C$ 上。
  5. 把 $i-1$ 个盘子移到 $C$ 上。

$$
g(i) = g(i-1) + 1+f(i-1)+1+g(i-1) = 2g(i-1)+f(i-1)+2
$$

当然,注意到 $f(i)$ 的公式,也可以写成
$$
g(i) = f(i) + f(i-1) + 1
$$
个人认为,从计算效率而言相差不大。前一种更适合并行,后一种 $g(i)$ 想计算的话必须等 $f(i)$ 算完。

你当前正在回复 博客/题目
存在问题!