Hanoi 塔問題(Java實現)
Hanoi 塔問題是一個很經典的遞歸問題
- 設a,b,c是3個塔座。開始時,在塔座a上有一疊共n個圓盤,這些圓盤自下而上,由大到小地疊在一起。各圓盤從小到大編號爲1,2,…,n,現要求將塔座a上的圓盤移到塔座b上,並仍按同樣順序疊置。在移動圓盤時應遵守以下移動規則:
- 規則1:每次只能移動1個圓盤;
- 規則2:任何時刻都不允許將較大的圓盤壓在較小的圓盤之上;
- 規則3:在滿足移動規則1和2的前提下,可將圓盤移至a,b,c中任一塔座上。
思路
- 如果只有 1 個圓盤,a --> c
- 如果圓盤數大於1
- 將 n - 1 個圓盤,從 a 藉助 c 移動到 b
- 將剩下 1 個圓盤從 a 移動到 c
- 將 n - 1 個圓盤,從 b 藉助 a 移動到 c
Java源代碼
import java.util.Scanner;
/*
* 若塵
*/
/**
* Hanoi 塔問題
* @author ruochen
* @version 1.0
*/
public class Hanoi {
public static void main(String[] args) {
int n;
Scanner sc = new Scanner(System.in);
System.out.print("Please input num: ");
n = sc.nextInt();
System.out.println("Process: ");
move(n, 'A', 'B', 'C');
}
/**
* 圓盤移動
* @param n 圓盤個數
* @param a 需要移動的位置
* @param b 藉助的位置
* @param c 移動目的地
*/
public static void move(int n, char a, char b, char c) {
if (n < 0) {
System.out.println("enter n > 0");
} else if (n == 1) {
System.out.println(a + "-->" + c);
} else {
move(n - 1, a, c, b);
move(1, a, b, c);
move(n-1, b, a, c);
}
}
}