分治法
package utitled;
public class HanoiTowerDemo {
/**
* 若盤子只有一個:A -> C 柱
*
* 若盤子n >= 2
* 將hanoi tower分成兩部分來看,
* 最底部盤上方全部的盤都屬於另一部分 A -> B 柱
* 最底部的大盤視為一部分 A -> C 柱
* 最底部盤上方全部的盤都屬於另一部分 B -> C 柱
*/
public static void main(String[] args) {
showDishesMovedTrace(5, 'A', 'B', 'C');
}
private static void showDishesMovedTrace(int num, char pillarA, char pillarB, char pillarC) {
if (num == 1) {
// 若盤子只有一個,A -> C
System.out.printf("第%d個盤,從%c -> %c\n", num, pillarA, pillarC);
} else {
// 若盤子有2個以上,最底盤上面的所有盤 A -> B,借助C
showDishesMovedTrace(num - 1, pillarA, pillarC, pillarB);
// 最底部盤A -> C,借助B
System.out.printf("第%d個盤,從%c -> %c,借助%c\n", num, pillarA, pillarC, pillarB);
// 將B柱所有盤移動到C,B -> C,借助A
showDishesMovedTrace(num - 1, pillarB, pillarA, pillarC);
}
}
}
如有敘述錯誤,還請不吝嗇留言指教,thanks!