Hanoi问题

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

Hanoi问题

图. 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 }

 

你可能感兴趣的:(问题)