Hanoi 塔問題(Java實現)

Hanoi 塔問題(Java實現)

Hanoi 塔問題是一個很經典的遞歸問題

  • 設a,b,c是3個塔座。開始時,在塔座a上有一疊共n個圓盤,這些圓盤自下而上,由大到小地疊在一起。各圓盤從小到大編號爲1,2,…,n,現要求將塔座a上的圓盤移到塔座b上,並仍按同樣順序疊置。在移動圓盤時應遵守以下移動規則:
    • 規則1:每次只能移動1個圓盤;
    • 規則2:任何時刻都不允許將較大的圓盤壓在較小的圓盤之上;
    • 規則3:在滿足移動規則1和2的前提下,可將圓盤移至a,b,c中任一塔座上。

思路

  1. 如果只有 1 個圓盤,a --> c
  2. 如果圓盤數大於1
    1. 將 n - 1 個圓盤,從 a 藉助 c 移動到 b
    2. 將剩下 1 個圓盤從 a 移動到 c
    3. 將 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);
		}
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章