A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高亮亮 高级黑马   /  2013-10-30 10:52  /  955 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 高亮亮 于 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. }
复制代码
如上代码,汉诺塔有个限制,就是盘子只能小的放在大的上面,这个他怎么实现的?我输出了下,是正确的,但是代码上我不明白他怎么实现的???

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

4 个回复

倒序浏览
给你看个图:忽略从哪个轴移动到哪个轴,只看每步移动哪个盘子
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

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
X11 中级黑马 2013-10-30 17:51:38
藤椅
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.        }

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的链接
http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
黄炳期 发表于 2013-10-30 22:10
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的链接
http://bbs.itheima.com/thread-89313- ...

其实还是不太能转过来弯……自己消化下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马