汉诺塔:
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
假设汉诺塔的圆盘数有5个,根据规则易发现:
将前5个移动到Z上,需要将5移动到Z上
要想将5移动到Z上,先将前4个移动到Y上
将前4个移动到Y上,需要将4移动到Y上
要想将4移动到Y上,先将前3个移动到Z上…………将前1个移动到Y或者Z轴上。
3个 X->Z
前2个 X->Y
前1个 X->Z
第2个 X->Y
前1个 Z->Y
第3个 X->Z
前2个 Y->Z
前1个 Y->X
第2个 Y->Z
前1个 X->Z
64个 X->Z
前63个 X->Y
前62个 X->Z第63个 X->Y
前62个 Z->Y
第64个 X->Z
前63个 Y->Z
前62个 Y->X
第63个 Y->Z
前62个 X->Z
我们以5个盘子为例,详细讲述,下面是代码!!!!!!
class Demo{
public static void main(String[] args){
f(5,"X","Y","Z");
}
public static void f(int n,String nowIn,String mid,String lastIn){
if(n==1){
System.out.println(nowIn +"->"+ lastIn);
}else{
f(n-1,nowIn,lastIn,mid);
System.out.println(nowIn +"->"+ lastIn);
f(n-1,mid,nowIn,lastIn);
}
}
}
代码很简洁,f(n,a,b,c)可理解为将前n项从a移动到c。其中b起到辅助的作用,出发地a,目的地c,辅助点b是会随着移动的盘中相对变化。下面是解合思路对代码的解析:
前5个 X->Z 调用f(5)………………(最大的问题)
前4个 X->Y 调用f(4)出发地X,目的地Y,调用时会不断调用自身与调用f(5)类似直到调用f(1)
第5个 X->Z
前4个 Y->Z 调用f(4)出发地Y,目的地Z,调用时会不断调用自身与调用f(5)类似直到调用f(1)
………………………………
调用f(1)可以说是:移动前1个,此时的前1个就是第1个
移动前1个 X -> Y? or Z? 由n的奇偶决定
========================================================================
当f(1)显示 X -> Y? or Z? 时,然后弹栈,
在f(2)中当f(1)弹栈时下面执行的显示 第二个从X->? ,该?柱是前2个盘的目的地,但此时只移动了第二个,显示完后执行f(1)但此时移动的是前一个从另一个柱(不是 X柱 和 ?柱 )移动到?柱。
当f(2)弹栈时,f(3)也像f(2)上述…………直到f(5)弹栈
该代码执行的结果为:
当盘子数量为5时,显示每一步移动的路径
X->Z
X->Y
Z->Y
X->Z
Y->X
Y->Z
X->Z
X->Y
Z->Y
Z->X
Y->X
Z->Y
X->Z
X->Y
Z->Y
X->Z
Y->X
Y->Z
X->Z
Y->X
Z->Y
Z->X
Y->X
Y->Z
X->Z
X->Y
Z->Y
X->Z
Y->X
Y->Z
X->Z