一,前言
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘
二,实现逻辑
通过第二个空柱子作为媒介,把n-1个圆盘移到空柱子,把第n个圆盘移到第三个柱子,在把n-2个圆盘通过第三柱子移到第一个柱子,把n-1的柱子移到第上个柱子,反复操作直到把所有圆盘从下往上按照大小顺序放到第三个柱子上,实现递归逻辑。
模拟4个圆盘时,汉诺塔的移动顺序,用数字代替圆盘,数字大小代替圆盘大小。4个圆盘要移到15次,3个圆盘要移动7次,2个圆盘则需要移动3次,一个圆盘直接移动即可。圆盘个数和要移动次数之间的关系是2的n次方减一。
三、实现代码
平台:Visual Studio 2022
#include <stdio.h>
void move(char x1, char x2) {
printf("%c->%c ", x1, x2);
}
void hannuota(int n, char x1, char x2, char x3) {
if (n == 1)
move(x1, x3);
else {
hannuota(n - 1, x1, x3, x2);
move(x1, x3);
hannuota(n - 1, x2, x1, x3);
}
}
int main() {
hannuota(n, 'A', 'B', 'C');
return 0;
}
原理:封装函数hannuota(n, ‘x1’, ‘x2’, ‘x3’)和move函数( 'x1', 'x2' )打印移动路线.
调用函数传入参数,其中n是塔数;A、B、C,3个字符为抽象成的3个柱子。
如果只有1层那么直接输出;
否则就有2种情况,其1是将n-1个碟子从A经C到B,其2是将n-1个碟子从B经A到C.
把n=5传入参数,运行代码: