汉诺塔
Time Limit: 1000MS Memory limit: 65536K
题目描述
汉诺塔(又称河内塔)问题是印度的一个古老的传说。
开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒A、B和C,A上面套着n个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从A棒搬到C棒上,规定可利用中间的一根B棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。
僧侣们搬得汗流满面,可惜当n很大时这辈子恐怕就很搬完了。
聪明的你还有计算机帮你完成,你能写一个程序帮助僧侣们完成这辈子的夙愿吗?
开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒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; }