1. 程式人生 > >遞迴經典題目-移動漢諾塔 https://www.cnblogs.com/dmego/p/5965835.html

遞迴經典題目-移動漢諾塔 https://www.cnblogs.com/dmego/p/5965835.html

一.起源:

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

二.抽象為數學問題:

  如下圖所示,從左到右有A、B、C三根柱子,其中A柱子上面有從小疊到大的n個圓盤,現要求將A柱子上的圓盤移到C柱子上去,期間只有一個原則:一次只能移到一個盤子且大盤子不能在小盤子上面,求移動的步驟和移動的次數.

import java.math.BigInteger;
import java.util.Scanner;
public class TowersOfHanoi {
    public static BigInteger count=new BigInteger("0");
    public static void main(String args[]){
        Scanner in=new Scanner(System.in);
        char a='a';
        char b='b';
        char c='c';
        while(in.hasNext()){
            int n=in.nextInt();
            hannuo(n,a,b,c);
            System.out.println("一共:"+count+"次");
            count=new BigInteger("0");
        }
    }
    public static void move(int M,char x,char y){
        count=count.add(new BigInteger("1"));
        System.out.println("第"+count+"移動"+":"+M+":"+x+"->"+y);
    }
    public static void hannuo(int n,char a,char b,char c){
        if(n==1){
            count=count.add(new BigInteger("1"));
            System.out.println("第"+count+"移動"+":"+n+":"+a+"->"+c);
        }else{
            hannuo(n-1,a,c,b);
            move(n,a,c);
            hannuo(n-1,b,a,c);
        }
    }
}

 

import java.util.Scanner;
public class TowersOfHanoi {
    static int m =0;//標記移動次數
    //實現移動的函式
    public static void move(int disks,char N,char M) {
        System.out.println("第" + (++m) +" 次移動 : " +" 把 "+ disks+" 號圓盤從 " + N +" ->移到->  " + M);
    }
    //遞迴實現漢諾塔的函式
    public static void hanoi(int n,char A,char B,char C) {
        if(n == 1)//圓盤只有一個時,只需將其從A塔移到C塔
            TowersOfHanoi.move(1, A, C);//將編b號為1的圓盤從A移到C
        else {//否則
            hanoi(n - 1, A, C, B);//遞迴,把A塔上編號1~n-1的圓盤移到B上,以C為輔助塔
            TowersOfHanoi.move(n, A, C);//把A塔上編號為n的圓盤移到C上
            hanoi(n - 1, B, A, C);//遞迴,把B塔上編號1~n-1的圓盤移到C上,以A為輔助塔
        }
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        char A = 'A';
        char B = 'B';
        char C = 'C';
        while(in.hasNext()){
            System.out.println("******************************************************************************************");
            System.out.println("這是漢諾塔問題(把A塔上編號從小號到大號的圓盤從A塔通過B輔助塔移動到C塔上去");
            System.out.println("******************************************************************************************");
            System.out.println("請輸入圓盤的個數:");
            int disks = in.nextInt();
            TowersOfHanoi.hanoi(disks, A, B, C);
            System.out.println(">>移動了" + m + "次,把A上的圓盤都移動到了C上");
        }
        in.close();
    }

}