河內塔是一道經典數學謎題,規則如下
- 將第一根柱子上的碟子移動到第三根柱子
- 每次只能移動一個碟子
- 碟子只能放在這三根柱子中
- 碟子有大小之分,小的只能疊在大的上面
這並非一個無解的題,多嘗試一定試得出來
因此重點在最佳解,即如何用最少的步驟完成
數學公式為 2 ^ n - 1
因此 10 個盤子就至少要移動 1023 次
難怪益智玩具通常不會超過 7 片
如果在程式中,通常是考遞迴
不過若沒有這題的數學背景,是寫不太出來的
而知道了數學邏輯,就只是把它轉換成程式語言而已
步驟拆解:
- 將 A 塔頂部的 N-1 塊盤移動到 B 塔
- 將 A 塔的底盤移到 C 塔
- 將 B 塔的 N-1 塊盤移到 C 塔
public class Hanoi {
public static void main(String[] args) {
int level = 5;
printSteps(level, 'A', 'B', 'C');
System.out.println(countMoves(level));
}
public static void printSteps(int n, char a, char b, char c) {
if(n == 1) {
System.out.printf("move disk from %s to %s%n", a, c);
} else {
printSteps(n - 1, a, c, b);
printSteps(1, a, b, c);
printSteps(n - 1, b, a, c);
}
}
public static int countMoves(int n) {
int sum = 2;
for (int i = 0; i < n - 1; i++) {
sum *= 2;
}
return sum - 1;
}
}