汉诺塔算法-换一种方式去理解
2015-11-26 11:15
267 查看
汉诺塔,开始我也不知道这是干啥的,baidu了一下,古老传说之类,纯属没用的hbb.
其实简单直接的理解,不如看输出结果:(A,B,C三根柱子,A上有3个盘子,从小到大,1,2,3,从A移到C,结果还是从小到大,123,一步只能移动一个盘子,且总是小的在上面,这是规则)
结果:
从A移动盘子1号到C
从A移动盘子2号到B
从C移动盘子1号到B
**********************
从A移动盘子3号到C
**********************
从B移动盘子1号到A
从B移动盘子2号到C
从A移动盘子1号到C
可以用笔在纸上画画,就知道大概是怎么搬盘子了。
我们可以分析这个结果,大致分为三步,
1 从A移到B(中间经历了三步,但最终把A上的盘子移到了B)
2 从A移到C (这时,A柱上还剩最大的那个盘子,经过1的操作,已经把A柱上的盘子(除了最大的那个)已经都搬到了B上,直接把A最大的扳道C就可以了)
3 从B移到C(从B到C,中间也得经过三部,也要借助A柱,说白了,这时候的A冲当了B的角色)
再把java实现贴上,互相印证下吧
public static void moveDish(int level, char from, char inner, char to) {
if (level == 1) {
System.out.println("从" + from + "移动盘子1号到" + to);
} else {
moveDish(level - 1, from, to, inner);//表示第一大步,把A的盘子现搬到B(除了最大的那个盘子)
System.out.println("从" + from + "移动盘子" + level + "号到" + to);(把A最大的盘子搬到C)
moveDish(level - 1, inner, from, to);(除了最大的盘子在C,A柱上光毛了,其余都在B上,那么把B搬到C吧)
//这个算法,理解难,写出来很简单,只要把这三部记住,很轻松就能写出汉诺塔了。
}
}
public static void main(String[] args) {
int dDishks = 3;
moveDish(dDishks, 'A', 'B', 'C');
}
其实简单直接的理解,不如看输出结果:(A,B,C三根柱子,A上有3个盘子,从小到大,1,2,3,从A移到C,结果还是从小到大,123,一步只能移动一个盘子,且总是小的在上面,这是规则)
结果:
从A移动盘子1号到C
从A移动盘子2号到B
从C移动盘子1号到B
**********************
从A移动盘子3号到C
**********************
从B移动盘子1号到A
从B移动盘子2号到C
从A移动盘子1号到C
可以用笔在纸上画画,就知道大概是怎么搬盘子了。
我们可以分析这个结果,大致分为三步,
1 从A移到B(中间经历了三步,但最终把A上的盘子移到了B)
2 从A移到C (这时,A柱上还剩最大的那个盘子,经过1的操作,已经把A柱上的盘子(除了最大的那个)已经都搬到了B上,直接把A最大的扳道C就可以了)
3 从B移到C(从B到C,中间也得经过三部,也要借助A柱,说白了,这时候的A冲当了B的角色)
再把java实现贴上,互相印证下吧
public static void moveDish(int level, char from, char inner, char to) {
if (level == 1) {
System.out.println("从" + from + "移动盘子1号到" + to);
} else {
moveDish(level - 1, from, to, inner);//表示第一大步,把A的盘子现搬到B(除了最大的那个盘子)
System.out.println("从" + from + "移动盘子" + level + "号到" + to);(把A最大的盘子搬到C)
moveDish(level - 1, inner, from, to);(除了最大的盘子在C,A柱上光毛了,其余都在B上,那么把B搬到C吧)
//这个算法,理解难,写出来很简单,只要把这三部记住,很轻松就能写出汉诺塔了。
}
}
public static void main(String[] args) {
int dDishks = 3;
moveDish(dDishks, 'A', 'B', 'C');
}
相关文章推荐
- Python爬虫实战(一):爬糗事百科段子
- 笔记——搭建简易NFS服务
- 如何正确的获得一个view的宽和高
- codeforces602C The Two Routes (最短路模板题)
- 1006. 换个格式输出整数 (15)
- Fragment切换 保存状态(add show hide)
- Git关于忽略Xcode工程中UserInterfaceState.xcuserstate文件的问题
- GRE tunnels in neutron
- easyui 表单自定义验证 正则表达式验证
- MySQL SQL优化——分片搜索
- jQuery stop()用法以及案例展示
- egret dragonbones部件替换产生位移的解决方案
- jquery网页字体变大小
- 解决 java.util.prefs.BackingStoreException 报错问题
- 设置IOS按钮的背景
- ITween
- 汇编 DOS系统功能调INT 21H
- BAT及各大互联网公司2014前端笔试面试题:HTML/CSS篇
- 最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等
- WCF服务和客户端操作步骤