递归解决汉诺塔问题
题目来自百度百科:
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
c语言实现(假设最开始放64片黄金圆盘的柱子为A, 要移动到C柱子上,借助的介质为B柱子):
1 #include <stdio.h>
2 /*
3 * 伪算法(要移动盘子的柱子为A,借助的介质柱子为B,移动到目的柱子为C.
4 * 如果盘子数为1,则直接将盘子从A柱子移到C柱子。
5 * 否则:
6 * step1:将A柱子上的N-1个盘子借助于C柱子移动到B柱子上。
7 * step2:将A柱子上的第N个盘子直接移动到C柱子上。
8 * step3:将B柱子上的N-1个盘子借助A柱子移动到C柱子上。
9 */
10
11 void hanoi(int n, char A, char B, char C) {
12 if (1 == n) {
13 printf("将编号为%d的盘子从%c柱子直接移动到%c柱子\n", n, A, C);
14 } else {
15 hanoi(n - 1, A, C, B);
16 printf("将编号为%d的盘子从%c柱子直接移动到%c柱子\n", n, A, C);
17 hanoi(n - 1, B, A, C);
18 }
19 }
20 int main(void) {
21 char A = 'A';
22 char B = 'B';
23 char C = 'C';
24
25 int n;
26
27 printf("请输入柱子的个数:");
28 scanf("%d", &n);
29
30 hanoi(n, A, B, C);
31
32 return 0;
33 }
2 /*
3 * 伪算法(要移动盘子的柱子为A,借助的介质柱子为B,移动到目的柱子为C.
4 * 如果盘子数为1,则直接将盘子从A柱子移到C柱子。
5 * 否则:
6 * step1:将A柱子上的N-1个盘子借助于C柱子移动到B柱子上。
7 * step2:将A柱子上的第N个盘子直接移动到C柱子上。
8 * step3:将B柱子上的N-1个盘子借助A柱子移动到C柱子上。
9 */
10
11 void hanoi(int n, char A, char B, char C) {
12 if (1 == n) {
13 printf("将编号为%d的盘子从%c柱子直接移动到%c柱子\n", n, A, C);
14 } else {
15 hanoi(n - 1, A, C, B);
16 printf("将编号为%d的盘子从%c柱子直接移动到%c柱子\n", n, A, C);
17 hanoi(n - 1, B, A, C);
18 }
19 }
20 int main(void) {
21 char A = 'A';
22 char B = 'B';
23 char C = 'C';
24
25 int n;
26
27 printf("请输入柱子的个数:");
28 scanf("%d", &n);
29
30 hanoi(n, A, B, C);
31
32 return 0;
33 }
结果:
1 E:\tarbitrary\datastructure\recursion>gcc hanoi.c -o hanoi
2
3 E:\tarbitrary\datastructure\recursion>hanoi
4 请输入柱子的个数:3
5 将编号为1的盘子从A柱子直接移动到C柱子
6 将编号为2的盘子从A柱子直接移动到B柱子
7 将编号为1的盘子从C柱子直接移动到B柱子
8 将编号为3的盘子从A柱子直接移动到C柱子
9 将编号为1的盘子从B柱子直接移动到A柱子
10 将编号为2的盘子从B柱子直接移动到C柱子
11 将编号为1的盘子从A柱子直接移动到C柱子
2
3 E:\tarbitrary\datastructure\recursion>hanoi
4 请输入柱子的个数:3
5 将编号为1的盘子从A柱子直接移动到C柱子
6 将编号为2的盘子从A柱子直接移动到B柱子
7 将编号为1的盘子从C柱子直接移动到B柱子
8 将编号为3的盘子从A柱子直接移动到C柱子
9 将编号为1的盘子从B柱子直接移动到A柱子
10 将编号为2的盘子从B柱子直接移动到C柱子
11 将编号为1的盘子从A柱子直接移动到C柱子