汉诺塔

汉诺塔

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;
}
原文地址:https://www.cnblogs.com/libao/p/2454303.html