5-17 汉诺塔的非递归实现 (25分)
借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。
输入格式:
输入为一个正整数N,即起始柱上的盘数。
输出格式:
每个操作(移动)占一行,按柱1 -> 柱2
的格式输出。
输入样例:
3
输出样例:
a -> c
a -> b
c -> b
a -> c
b -> a
b -> c
a -> c
-------------------------------
汉若塔问题的递归求解代码如下
1 #include <stdio.h> 2 3 void move(char x, int n, char y) 4 { 5 printf("put %d from %c to %c ", n, x, y); 6 } 7 8 void hanoi(int n, char x, char y, char z) 9 { 10 if(n == 1) 11 move(x, 1, z); 12 else 13 { 14 hanoi(n-1, x, z, y); 15 move(x, n, z); 16 hanoi(n-1, y, x, z); 17 } 18 } 19 20 int main() 21 { 22 int n; 23 scanf("%d", &n); 24 hanoi(n, 'a', 'b', 'c'); 25 }
非递归求解,目前还不会……