美文网首页
河内塔算法

河内塔算法

作者: DoflaKaiGo | 来源:发表于2018-10-10 16:31 被阅读10次
    • 河内塔(hanoi)算法

    河内塔算法的介绍网上资料很多,我在这里再把需求简单说一下,有三棵柱子(A,B,C),A柱子上套了n个从小到大的圆环,要把这所有的n个圆环移动到C柱子上.

    规则:小的圆环只能放到大的圆环上面,或者这个圆环下面没有圆环

    • 下面我先把算法放出来
    void  hanoi(int n, char A, char B, char C) {
        if(n == 1) {
            printf("Move sheet %d from %c to %c\n", n, A, C);
        } else {
            hanoi(n-1, A, C, B);
            printf("Move sheet %d from %c to %c\n", n, A, C);
            hanoi(n-1, B, A, C);
        }
    }
    int main() {
            int n;
            printf("请输入盘数:");
            scanf("%d", &n);
            hanoi(n, 'A', 'B', 'C');
            return 0;
    }
    

    理解:河内塔是个很好的理解递归的算法问题,只有一个圆环的时候即是终止条件,大于1的时候递归,我是这样理解的:

    n = 1; 直接把A上的环移到 C
    n = 2;先把上面小的从A移到B,再把下面大的从A移到C,再把小的从B移到C
    当n>2时,把上面的n-1个看成一个整体,这样就变成了n=2的问题了,把上面n-1个作为整体的从A移到B,再把下面大的从A移到C,再把n-1个从B移到C,此时我们压力考虑的就就是怎么把n-1个移到C的问题,把 n-1 看成 上面的n-2个下面的 1个,又是变成两个环的移动问题了......以此类推,直到下面的环都移动完了,只剩上面最后一个就是 n=1的情况,直接移到C就完成了所有环的移动.
    即每次只移动最下面一个环,上面的交给递归完成

    相关文章

      网友评论

          本文标题:河内塔算法

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