美文网首页
C语言——汉诺塔问题

C语言——汉诺塔问题

作者: WhiteStruggle | 来源:发表于2020-11-03 18:05 被阅读0次

    汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

    问题解析:

    假设存在 N 层,首先需要经过一些换位操作将 第 N层 移倒到 C柱,然后是 N-1层,接着是 N-2层,以此类推,完成置换

    hanio4.png

    经过一系列操作,得到


    Hanio.png

    移动 N层 到 C柱

    hanio2.png

    接着是 N-1 层

    hanio3.png

    · · · · · · · ·

    hanio6.png

    完成置换:


    hanio5.png 分析.png

    移动第n层 需要先将 n-1层 移到 B ,然后将 n层 移到 C , 再把 n-1层 移到 C。

    • 移动第n-1层 到 B , 需要先将 n-2层 移到 C ,然后将 n-1层 移到 B , 再把 n-2层 移到 B
    • 移动第n-1层 到 C , 需要先将 n-2层 移到 B ,然后将 n-1层 移到 C , 再把 n-2层 移到 C

    将问题简化为三个步骤:

    1. 将 n-1 移到 B
    2. 将 n 移到 C
    3. 将 n-1 移到 C

    前n-1层 看成一个整体 为 M , 最大层 为 n ,系统中就包含两层 : nM

    递推式 :

    F(n) = 2F(n-1) + 1 
    
    证明:
    F(1) = 1
    F(2) = 2*1 + 1 = 3
    F(3) = 2*3 + 1 = 7
    F(4) = 2*7 + 1 = 15
    ·····
    
    即 2^1-1 , 2^2-1 , 2^3-1 , 2^4-1 ······
    
    因此可以推出:
    F(n) = 2^n - 1
    

    首先确定总层数,

    • 如果层数是奇数,最上层由A--->C。
    • 如果层数是偶数,最上层A--->B。

    利用每递归一层交换B、C柱,由底层倒推到顶层,直到n==1

    void hanoi(int n, char x, char y, char z)
    {
        if (n == 1)
        {
            move(x, 1, z);
        }
        else
        {
            hanoi(n - 1, x, z, y);
            move(x, n, z);
            hanoi(n - 1, y, x, z);
        }
    }
    void move(char s, int n, char t)
    {
        printf("%d 从 %c 移动到 %c\n", n, s, t);
    }
    

    相关文章

      网友评论

          本文标题:C语言——汉诺塔问题

          本文链接:https://www.haomeiwen.com/subject/hwvbvktx.html