汉诺塔,开始我也不知道这是干啥的,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');
}