黑马程序员技术交流社区

标题: 汉诺塔 算法 请教 [打印本页]

作者: 高亮亮    时间: 2013-10-30 10:52
标题: 汉诺塔 算法 请教
本帖最后由 高亮亮 于 2013-11-1 11:21 编辑
  1. public class HanoiTower {
  2.     public static void moveDish(int level, char from, char inter, char to) {
  3.         if (level == 1) {// 如果只有一个盘子就退出迭代
  4.             System.out.println("从 " + from + " 移动盘子 1 号到 " + to);
  5.         } else {// 如果有大于一个盘子就继续迭代
  6.             moveDish(level - 1, from, to, inter);
  7.             System.out.println("从 " + from + " 移动盘子 " + level + " 号到 " + to);
  8.             moveDish(level - 1, inter, from, to);
  9.         }
  10.     }

  11.     public static void main(String[] args) {
  12.         int nDisks = 3;// 设置汉诺塔为3阶
  13.         moveDish(nDisks, 'A', 'B', 'C');// 实现移动算法
  14.     }
  15. }
复制代码
如上代码,汉诺塔有个限制,就是盘子只能小的放在大的上面,这个他怎么实现的?我输出了下,是正确的,但是代码上我不明白他怎么实现的???
作者: 零下五度的水    时间: 2013-10-30 12:13
给你看个图:忽略从哪个轴移动到哪个轴,只看每步移动哪个盘子
1                                  一个盘子:只需要移动1号盘子1次
121                               两个盘子:移动顺序是1号盘子2号盘子1号盘子
1213121
121312141213121
规律是:第N步只会移动第N个盘子1次,这之前和这之后移动盘子的规律和移动N-1个盘子的规律是完全一样的
比如:3个盘子的时候,移动第3个盘子之前和之后,规律是121,这正是移动2个盘子的规律
再看移动位置:之前的是AC,AB,CB,就是把这2个盘子从A移动到B;之后的是BA,BC,AC,就是把这2个盘子从B移动到C
代码里的else块就是干这个活的:第一次迭代就是把n-1个盘子从A移动到B;输出语句是移动第n个盘子;第二次迭代就是把n-1个盘子从B移动到C
作者: X11    时间: 2013-10-30 17:51
else {// 如果有大于一个盘子就继续迭代

06.            moveDish(level - 1, from, to, inter);   // 把level以上盘子全部移到中间

07.            System.out.println("从 " + from + " 移动盘子 " + level + " 号到 " + to);  //把level盘子(最下面这个盘子)移到右边

08.            moveDish(level - 1, inter, from, to);   // 把level以上盘子(现在这些盘子全部在中间)全部移到右边

09.        }

作者: 黄炳期    时间: 2013-10-30 22:10
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的链接
http://bbs.itheima.com/thread-89313-1-1.html
作者: 高亮亮    时间: 2013-11-1 11:20
黄炳期 发表于 2013-10-30 22:10
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的链接
http://bbs.itheima.com/thread-89313- ...

其实还是不太能转过来弯……自己消化下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2