受限汉诺塔问题
【题目描述】
古代有一个梵塔,塔上有3个基座。在初始格局下,A座上有64个大小两两不等的盘子,且大盘在下、小盘在上。要求把64个盘子全部移到C座。移动过程中满足3个条件:
- 每次只能移动一个盘子
- 对于所有基座来说,如果基座上有盘子,那么一定是大盘在下、小盘在上
- 对于移动盘子设了限制,只能将盘子从其他基座移到B,或者从B移动到其他基座
【问题分析】
在原有的基础上,受限汉诺塔增加了一条要求:只能从别的柱子到B或者从B到其他柱子,说明原来的代码中的 将B座上的n-1个盘子借助A座移向C座
这一步骤是行不通的,所以在此基础上,我们要对其进行修改,通过题意可知,只能从借助B座。
【算法思路】
简化题目,令n=2,其中,n是圆盘的数量。画图如下(手绘,有点丑,请见谅):
由n=2,可推广至n=n。
【代码示例】
以c语言为例:
#include<stdio.h>
void move(int x, int y)
{
printf("%c->%c\n", x, y);
}
void hanoi(int n, char a, char b, char c)
{
if (n == 1)
{
move(a, b);
move(b, c);
}
else
{
hanoi(n - 1, a, b, c); //将A座上的n-1个盘子借助B座移向C座
move(a, b); //将A座上最后一个盘子移向B座
hanoi(n - 1, c, b, a); //将C座上的n-1个盘子借助B座移向A座
move(b, c); //将B座上最后一个盘子移向C座
hanoi(n - 1, a, b, c); //将A座上的n-1个盘子借助B座移向C座
}
}
//move中的实参与hanoi函数中的形参相对应,而hanoi函数中形参a,b,c所对应的值也是在有规律的变化
int main()
{
int n = 0;
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
【运行结果】
以n=3为例: