2019-09-30  2024-09-15    237 字  1 分钟

将汉诺塔中的3跟柱子改为4根,求盘子数为1到12时将全部盘子从第一根移动到最后一根需要移动的次数。

考虑正常的汉诺塔规则,若有 n 个圆盘,那么就要将前 n−1 个圆盘移动到 2 号柱,再把最大的圆盘移动到 3 号柱,最后将前 n−1 个圆盘移动到 3 号柱。那么将 n−1 个圆盘移动又要涉及到 n−2 个圆盘,以此类推,所以,3个柱子得到的方程是 $f[i]=f[i-1] \times 2 + 1$

Code
void hanoi(int n, char A, char B, char C){
    if(n == 1) printf("%c -> %c\n", A, C);
    else{
        hanoi(n-1, A, C, B); // 把 A 上面的 n-1 块借助 C 移动到 B
        printf("%c -> %c\n", A, C); // 第 n 块从 A 移动到 C
        hanoi(n-1, B, A, C); // 把 B 上面的 n-1 块借助 A 移动到 C
    }
}