黑马程序员技术交流社区
标题:
汉诺塔 算法 请教
[打印本页]
作者:
高亮亮
时间:
2013-10-30 10:52
标题:
汉诺塔 算法 请教
本帖最后由 高亮亮 于 2013-11-1 11:21 编辑
public class HanoiTower {
public static void moveDish(int level, char from, char inter, char to) {
if (level == 1) {// 如果只有一个盘子就退出迭代
System.out.println("从 " + from + " 移动盘子 1 号到 " + to);
} else {// 如果有大于一个盘子就继续迭代
moveDish(level - 1, from, to, inter);
System.out.println("从 " + from + " 移动盘子 " + level + " 号到 " + to);
moveDish(level - 1, inter, from, to);
}
}
public static void main(String[] args) {
int nDisks = 3;// 设置汉诺塔为3阶
moveDish(nDisks, 'A', 'B', 'C');// 实现移动算法
}
}
复制代码
如上代码,汉诺塔有个限制,就是盘子只能小的放在大的上面,这个他怎么实现的?我输出了下,是正确的,但是代码上我不明白他怎么实现的???
作者:
零下五度的水
时间:
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