三个盘子的汉诺塔
然后你移完发现左边柱子下面又蹦出来一个盘子
好吧, 那就把中间的柱子看成目标柱
所以说一共就三步:
把 n-1 号盘子移动到缓冲区
把1号从起点移到终点
然后把缓冲区的n-1号盘子也移到终点
写成C语言代码:
#include <stdio.h>
void f(char a, char b) {
printf("从%c柱上往%c柱上挪动一个圆盘\n", a, b);
}
void g(int i, char a, char b, char c) {
if (i == 2) { //2块圆盘
f(a, b); //把a柱子上 最上面的一块 挪动到 b柱子上去
f(a, c); //把a柱子上 最下面(最大)的那一块 挪动到 c柱子上去
f(b, c); //把b柱子上 那一块 挪动到 c柱子上去
} else if (i > 2) { //分成a柱子上的圆盘 两部分: ①第i块 圆盘和②i-i块 圆盘
//i-i块 圆盘那一部分
g(i - 1, a, c, b); //把a柱子上的 i-1块 圆盘通过c柱子 挪动到 b柱子上去
//第i块 圆盘那一部分
f(a, c); //把a柱子上的 第i块(最大的那一块)挪动到 c柱子上去
//对于b柱子上的i-i块 圆盘那一部分进行再次递归 转移
g(i - 1, b, a, c); //把b柱子上的 i-1块 圆盘通过a柱子 挪动到 c柱子上去
}
}
int main(void) {
g(3, 'A', 'B', 'C');
return 0;
}
运行结果: