1. 程式人生 > >我理解的漢諾塔---java版

我理解的漢諾塔---java版

漢諾塔(摘自百度百科):

        漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。

 

直接上程式碼

package cn.nrsc.algorithm;

import java.util.Scanner;

/**
 * @author 孫川
 * 
 *         漢諾塔問題需要從巨集觀上去理解其過程,即:
 *         假設我們定義了一個函式move(),這個函式可以把n個盤子按照漢諾塔的規則由t1藉助t2挪動到t3
 * 
 *   ①那麼如果盤子數大於1的話,我們肯定也可以利用這個move()函式,將n-1個盤子由t1藉助t3挪動到t2
 *   ②挪動完之後,t1就只剩一個最大的盤子了,t3此時沒有盤子,所以這時候就可以將t1的盤子直接挪動到t3
 *   ③此時,只要再借用move()函式將t2上的n-1個盤子藉助t1挪動到t3,就完成了將所有的盤子從t1藉助t2挪動到t3
 */

public class Hanoi {
	// 將盤子由t1藉助t2全部挪動到t3
	public static void move(int n, int t1, int t2, int t3) {
		// 如果只有一個盤子的話直接從t1--->t3就可以了
		if (n == 1)
			System.out.println("從" + t1 + "移動到-->" + t3);
		else {
			// 如果不是一個盤子的話,將主要分三步

			// ①將n-1個盤子由t1藉助t3挪到t2
			move(n - 1, t1, t3, t2);

			// ②從t1將最後一個盤子挪到t3
			System.out.println("從" + t1 + "移動到" + t3);

			// ③將t2上的n-1個盤子再借助t1挪到t3
			move(n - 1, t2, t1, t3);
		}
	}

	public static void main(String[] args) {
		System.out.println("請輸入總盤子數:");
		Scanner sc = new Scanner(System.in);

		int n = sc.nextInt();
		move(n, 1, 2, 3);
	}

}