Hanoi问题

n 阶 Hanoi 塔问题假设有三个分别命名为 X、Y 和 Z 的塔座,在塔座 X 上插有 n 个直径大小各不相同、从小到大编号为 1,2,...,n 的圆盘,如下图所示。

图. Hanoi 塔问题

现要求将 X 塔上的 n 个圆盘移动到 Z 上并仍按同样的顺序叠放,圆盘移动时必须遵循下列规则:
• 每次只能移动一个圆盘;
• 圆盘可以插在 X、Y 和 Z 中的任一塔座上;
• 任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。

递归代码如下:

 1 hanoi.c
 2 
 3 
 4 /*
 5 * @brief 将塔座 x 上按直径有小到大且自上而下编号
 6 * 为 1 至 n 的 n 个圆盘按规则搬到塔座 z 上,y 可用做辅助塔座.
 7 * @param[in] n 圆盘个数
 8 * @param[in] x 源塔座
 9 * @param[in] y 辅助塔座
10 * @param[in] z 目标塔座
11 * @return 无
12 * @note 无
13 * @remarks 无
14 */
15 void hanoi(int n, char x, char y, char z)
16 {
17   if(n == 1)
18 
19   {
20     /* 移动操作 move(x,n,z) 可定义为(c 是初始值为的全局变量,对搬动计数)
21       printf("%i. Move disk %i from %c to %c\n", ++c, n, x, z);
22     */
23     move(1, x, z); /* 将编号为 1 的圆盘从 x 移动到 z */
24     return;
25   }
26 
27   else
28 
29   {
30     /* 将 x 上编号 1 至 n-1 的圆盘移到 y,z 作辅助塔 */
31     hanoi(n-1, x, z, y);
32     move(n,x,z); /* 将编号为 n 的圆盘从 x 移到 z */
33     /* 将 y 上编号至 n-1 的圆盘移到 z,x 作辅助塔 */
34     hanoi(n-1, y, x, z);
35   }
36 }

 

posted @ 2015-03-13 10:52  简简单单-平平淡淡  阅读(643)  评论(1编辑  收藏  举报