• 汉诺塔


    汉诺塔

    Time Limit: 1000MS Memory limit: 65536K

    题目描述

    汉诺塔(又称河内塔)问题是印度的一个古老的传说。

    开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒A、B和C,A上面套着n个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从A棒搬到C棒上,规定可利用中间的一根B棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。

    僧侣们搬得汗流满面,可惜当n很大时这辈子恐怕就很搬完了。

    聪明的你还有计算机帮你完成,你能写一个程序帮助僧侣们完成这辈子的夙愿吗?

    输入

    输入金片的个数n。这里的n<=10。

    输出

    输出搬动金片的全过程。格式见样例。

    示例输入

    2

    示例输出

    Move disk 1 from A to B
    Move disk 2 from A to C
    Move disk 1 from B to C

    提示

    可以用递归算法实现。
     
     
    解题思路
      当n=1时,问题比较简单,只要将编号为1 的圆盘从塔座a直接移至塔座b即可。当n>1时,需要利用塔座c作为辅助塔座。此时若能设法将n-1个较小的圆盘依照移动规则从塔座a移至塔座c,然后,将剩下的最大圆盘从塔座a移至塔座b,最后,在设法将n-1个较小的圆盘从塔座c移至塔座b。总的移动步数为2^n-1.
    View Code
    #include <stdio.h>
    int num = 0;
    
    void Move(int n, char a, char b)
    {
        ++num;
        printf ( "Move disk %d from %c to %c\n", n, a, b);
    }
    
    void Hannoi(int n, char a, char b, char c)
    {
        if ( n > 0 )
        {
            Hannoi(n-1, a, c, b);//将n-1个较小的圆盘依照移动规则从塔座a移至塔座c
            Move(n, a, b);       //将剩下的最大圆盘从塔座a移至塔座b
            Hannoi(n-1, c, b, a);//将n-1个较小的圆盘从塔座c移至塔座b
        }
    }
    
    int main()
    {
        int n = 0;
        while ( scanf ( "%d", &n ) != EOF )
        {
            num = 0;
            Hannoi(n, 'A', 'B', 'C');
            printf ( "\nThe total step is %d.\n", num);
        }
        return 0;
    }
  • 相关阅读:
    webpack 添加 jquery 插件
    openldap安装配置
    生成ssl证书
    vyos (三) HA
    vyatta的fork开源版本
    vyos (一) 基础配置
    iptable软路由
    keepalive实现web服务器active/passive
    docker学习(二)
    docker学习(一)
  • 原文地址:https://www.cnblogs.com/libao/p/2454303.html
Copyright © 2020-2023  润新知