有A、B、C三根细柱子,其中A柱子上从上到下堆放着n个由小到大的环形盘子,将A柱子上的盘子移动到C柱子上,以B柱子为中转站,且移动过程中大盘子不能放在小盘子上(在B柱子从上到下也要遵循也要由小到大的摆放)。
【以三个盘子为例】实现效果如下图所示
将盘子进行编号,移动顺序为
第一次:盘1从A移到C
第二次:盘2从A移到B
第三次:盘1从C移到B
第四次:盘3从A移到C
第五次:盘1从B移到A
第六次:盘2从B移到C
第七次:盘1从A移到C
过程如下图所示
(1) 最简单的就就是只有一个盘子:
n==1,直接从A盘移动到C盘(这个就是基线条件)
(2)n大于等于2,将A柱上的n-1个移到B柱上,只留下第n个,然后再将B柱上的n-2个移到A柱上,留下第n-1个……使用n-1调用自己(递归条件)
//汉诺塔问题(Hanoi)
#include
#include
void Hanoi(int n,char a,char b,char c)
{
if (n==1)
printf("将编号为%d的盘子从%c移到%c\n",n,a,c);
else
{
Hanoi(n-1,a,c,b);
printf("将编号为%d的盘子从%c移到%c\n",n,a,c);
Hanoi(n-1,b,a,c);
}
}
int main()
{
int n;
printf("请输入要移动盘子的个数:");
scanf("%d", &n);
Hanoi(n,'A','B','C');
system("pause");
}
同样以三个盘子为例,解释自定义函数Hanoi函数的运算过程
(1)首先输入移动的盘子个数:3
(2)使用Hanoi函数:Hanoi(n,'A','B','C');——意思是将三个盘子从A柱移动到C柱,中转柱为B柱
(3)n不等于1,执行语句
Hanoi(n-1,a,c,b);
printf("将编号为%d的盘子从%c移到%c\n",n,a,c);
Hanoi(n-1,b,a,c);
即
图中的ABC均为实际柱子的编号,是实际意义,不是规范的代码。