n阶汉诺塔问题

问题描述:假设有三个分别命名为x,y,z的塔座,在塔座x上插有n个直径大小各不相同,且从小到大编号分别为1,2,..,n的圆盘,现要求将塔座x上的n个圆盘借助塔柱y移动到塔柱z,且仍按相同顺序叠排,圆盘移动时需遵循以下规则:

1) 每次只能移动一个圆盘

2)圆盘可以插在x,y,z中的任何一个塔座上

3)任何时刻不能将较大的圆盘压在较小的圆盘上

涉及变量:x,y,z:char型变量,三个塔座

                move:int型变量,移动的次数

                n:在两个方法中有不同的意义

涉及教材:《数据结构——Java语言描述(第2版)》 清华大学出版社

大致思路:

 利用递归思路,通过对hanoi()不断的调用来达成目的

 move函数是书写将编号为n的圆盘从所给的x塔座移动到z塔座

 hanoi()考虑了三种情况,n<1,n为1和n>1的情况

 当n<1时,其不符合实际情况,抛出异常,终止程序的运行

 当n=1时,有且只有1个圆盘,直接将其从x塔座移动到z即可

 当n>1时,从逻辑上来看,先将上面n-1个圆盘经由z的帮助移动到y,再将第n个圆盘移动到z,最后将n-1个圆盘经由x从y移动到z

这n-1个圆盘在不断的递归中直到取到编号为1的盘子之后才依次返回,开始执行下一步的move()和hanoi()

代码如下:

以上是我对汉诺塔问题的一些看法,希望对各位有所帮助

190121 Rewivy

猜你喜欢

转载自www.cnblogs.com/rewivy/p/10301374.html