假设有3个分别命名为x、y和z的塔座,在塔座x上插有n个直径大小各不相同、依小到大编号为l,2,…,n的圆盘,现要求将x轴上的n个圆盘移至z轴上并仍按同样顺序叠排,圆盘移动时必须遵循下列规则: (1)每次只能移动一个圆盘; (2)圆盘可以插在x、y和z中的任一塔座上; (3)任何时刻都不能将一个较大的圆盘压在较小圆盘之上。 n阶Hanoi塔问题 如何实现移动圆盘的操作呢? 当n=1时,问题比较简单,只要将编号为l的圆盘从塔座x直接移至塔座z上即可; 当n1时,需利用塔座y作辅助塔座,若能设法将压在编号为n的圆盘之上的n-1个圆盘从塔座x(依照上述法则)移至塔座y上,则可先将编号为n的圆盘从塔座x移至塔座z上,然后再将塔座y上的n-1个圆盘(依照上述法则)移至塔座z上。而如何将n-1个圆盘从一个塔座移至另一个塔座的问题是一个和原问题具有相同特征属性的问题,只是问题的规模变小,因此可以用同样的方法求解。 由此可得如算法所示的求解n阶Hanoi塔问题的递归函数。 算法分析 void hanoi (int n, char x, char y, char z) // 将塔座x上按直径由小到大且至上而下编号为1至n // 的n个圆盘按规则搬到塔座z上,y可用作辅助塔座。 { if (n==1) 3 move(x, 1, z); // 将编号为1的圆盘从x移到z
原创力文档

文档评论(0)