三層漢諾塔Java語言實現
問題描述
在諾基亞黑白機時代,玩過一個十分令人懷念的遊戲-漢諾塔,遊戲大致規則:有三根柱子A、B、C,在A柱子上從上到下存放了三個從小到大排序的碟子,每次只能移動一個碟子到另外的柱子上,同時每個柱子上小碟子必須在大碟子上邊,通過移動將所有碟子從A柱子移動到C柱子上,並從上到下從小到大排序存放方可獲勝。問題分析
首先,我們將碟子進行編寫序號,按照從小到大的順序爲:1、2、3。首先,我們考慮只有2個碟子的問題,先將1號存放到B柱子,然後將2號碟子存放到C柱子上,最後將1號存放到C柱子上,獲得勝利。其主體思路爲,將最大碟子以上所有碟子存放到B柱子進行中轉,然後將最大碟子存放到C柱子上,然後將中轉柱子B當作第一個柱子,A柱子然後轉爲中轉柱子,將其次最大碟子轉移到C柱子上,完成一次轉移。代碼分析
我們分析通過使用迭代遞歸的方式,解決上述問題
Begin
movePlate(numPlate,A,B,C){
if numPlate = 1
move(numPlate,A,C);
else
movePlate(numPlate-1,A,C,B);
move(numPlate,A,C);
movePlate(numPlate-1,B,A,C);
}
End
函數參數簡析:movePlate(剩餘數量,起始柱子,中介柱子,目標柱子)
4. Java代碼
package HanoiTower;
/**
* Created by gyc on 2017/2/28.
*/
public class HanoiTowerThree {
/**
*
* @param numPlate the number of plate
* @param s start station
* @param t transfer station
* @param e end station
*/
public static void movePlate(int numPlate, String s, String t, String e){
if (numPlate == 1){
System.out.println("Move Plate " + numPlate + " From " + s + " To " + e);
}else{
movePlate(numPlate-1, s, e, t);
System.out.println("Move Plate " + numPlate + " From " + s + " To " + e);
movePlate(numPlate-1, t, s, e);
}
}
public static void main(String[] args) {
int numPlate = 3;
movePlate(numPlate, "A", "B", "C");
}
}
測試成功
5. 輸出截圖