Hanio 問題
問題描述
廟裏的和尚,閒得無聊,廟中有三個柱子,分別標記爲柱子A,柱子B,柱子C.
柱子A有三個盤子,這三個盤子呢,直徑最大的放在最下面,第二大的放中間,最小的放最上面。
柱子B是空的。
柱子C也是空的。
如果A柱子上的盤子能借助B 搬到C柱子上,並切盤子順序是跟原先A上一致。做這個過程和尚感覺是非常有意思的。沒辦法,吃飽了撐的。
當然這裏面有兩個規則
1 第次只能搬一個
2 不能將大直徑的放到小直徑上面
分析問題
假設A上面有N個盤子,如果我呢把N-1個盤子已經搬到了B上面,我只需要將A盤子放到這個C上面,第N個盤子的直徑是最大的,再以後的搬動過程中是不需要動C上第N個盤子的。以上搬動N個盤子的問題,就變爲搬N-1個盤子的問題。如此規則執行下去,只後只有一個圓盤的時候,問題直接解決了。
這種方式適合遞歸算法
1 有遞歸出口,那就是當盤子只有一個時候,問題很簡單,直接解決
2 有策略能使問題規模縮小,並且問題是相似,
a 將N-1個盤子從A 搬到B柱上面,(藉助C)
b 將A柱子上第N個盤子搬到C柱上面
c 將B柱子上N-1個盤子搬到C柱子上面 (藉助A)
OK 那java實現爲
public void hanioAlgorithms(int n,String A,String B,String C){
if (n==1 )
{
move(1,A,C);
return;
}
hanioAlgorithms(n-1,A,C,B);
this.move(n, A, C);
hanioAlgorithms(n-1, B, A, C);
}
private void move(int n ,String A,String C){
System.out.println("將第"+n+"個盤子 從"+A+"移動到"+C);
}
}