受限汉诺塔问题 古代有一个梵塔,塔内有3个基座A、B、C,开始时A基座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但(1)每次只允许移动一个盘子;(2)在移动过程中在3个基座上的盘子都始终保持大盘在下,小盘在上;(3)任何移动要么把一个盘子搬到B上,要么从B上搬走一个盘子。请编程打印出移动过程 。
分析:把n个盘子从A移动到C可分五步完成
1)把1到n-1号盘子从A移动到C;
2)把n号盘子从A移动到B;
3)把1到n-1号盘子从C移动到A;
4)把n号盘子从B移动到C;
5)把1到n-1号盘子从A移动到C。
记void hanoi(int n, char a, char b, char c)为把n个盘子从A移动到C的函数,则可得
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
int count=0;
void sxhanoi(int n, char a, char b, char c)
{
if(n>0)
{ sxhanoi(n-1, a, b, c);
printf("move %d: %c-> %c\n", n, a, b);
count++;
sxhanoi(n-1, c, b, a);
printf("move %d: %c-> %c\n", n, b, c);
count++;
sxhanoi(n-1, a, b, c);
}
}
int main()
{
int n=3;
char a='A';
char b='B';
char c='C';
sxhanoi(n, a, b, c);
printf("\ncount=%d\n", count);
//system("pause");
//return 0;
}
运行结果:
move 1: A-> B
move 1: B-> C
move 2: A-> B
move 1: C-> B
move 1: B-> A
move 2: B-> C
move 1: A-> B
move 1: B-> C
move 3: A-> B
move 1: C-> B
move 1: B-> A
move 2: C-> B
move 1: A-> B
move 1: B-> C
move 2: B-> A
move 1: C-> B
move 1: B-> A
move 3: B-> C
move 1: A-> B
move 1: B-> C
move 2: A-> B
move 1: C-> B
move 1: B-> A
move 2: B-> C
move 1: A-> B
move 1: B-> C
count=26
--------------------------------
Process exited after 0.9864 seconds with return value 0
请按任意键继续. . .