經典算法:漢諾塔詳解,java實現


經典算法題:漢諾塔

題目描述:

相傳在古印度聖廟中,有一種被稱為漢諾塔(Hanoi)的游戲。該游戲是在一塊銅板裝置上,有三根桿(編號A、B、C),在A桿自下而上、由大到小按順序放置64個金盤(如下圖)。游戲的目標:把A桿上的金盤全部移到C桿上,並仍保持原有順序疊好。操作規則:每次只能移動一個盤子,並且在移動過程中三根桿上都始終保持大盤在下,小盤在上,操作過程中盤子可以置於A、B、C任一桿上。

image-20200113130228504

騷里騷氣分析:

解決辦法之一是用手抓起來直接挪過去,簡單粗暴(粗魯)。區區幾個小方塊而已,還難不倒我。

事實真的是這樣嘛,往往很多時候,現實中看似簡單的背后蘊含許多細節,而忽略細節的人面臨的將是失敗。

我們都不畏懼失敗,因為我們終將成功!但是不必要的挫折卻會使你一蹶不振。你不是不夠聰明,只是還缺少一雙發現細節的眼睛~。要知道這個游戲可是被放到四大文明古國—古印度的神廟里。就像古埃及金字塔那些神秘的數字一樣,令科學家們都感到不可思議。我們不能小瞧了他,更不可掉以輕心,就讓我們鄭重其事端正態度。所以請你務必穿一身黑色西服,擦亮你的愛馬仕皮鞋,把頭發梳成大人的模樣進入戰斗狀態。天黑的路雖沒有盡頭,可是你別忘了么,那一年我們一起變成了光!請記住!一定要全力以赴,不給自己退路!Maybe下一刻的你將光芒萬丈!


正兒八經解題:

漢諾塔移動思想分三步:

1、將上面的第1層~第(n-1)層從初始位置移動到中間位置
2、再將第n層移動到目標位置
3、最后將第1層到~第(n-1)層從中間位置移動到目標位置(三者順序不能變)

有疑惑???規則不是說每次只能移動一個漢諾塔么,假如n>2,那么第一步跟第三步都涉及到移動多個漢諾塔,這還怎么移?
第一步和第三步又將問題帶回了 ”將n塊漢諾塔從初始位置移動到目標位置“ ,不同的是:
1、移動的初始位置跟目標位置改變,
2、移動的數量n的值變成了n-1。

*/

剛開始學習遞歸的時候腦海里想不出來遞歸怎么實現的,還是要動筆推一下,想是想不完的。下面是調用一次遞歸函數,程序在調用函數跑起來的時候,就像一次請求被一層層處理並且轉發,被原路返回響應一樣。第一個響應數據必然是第二個響應要用到的數據。

image-20200113144425405

代碼

import java.util.Scanner;

public class hanoi {
    
    public static void hanio(int n,String A,String B,String C){
        if(n<1){   
            System.out.println("漢諾塔的層數不得小於一");
        }
        else if(n==1){   //遞歸出口
            System.out.println("移動:"+A+"——》"+C);
            return;
        }
        else{            //核心移動三步
            hanio(n-1,A,C,B);
            System.out.println("移動:"+A+"——》"+C);
            hanio(n-1,B,A,C);
        }
    }
    public static void main(String args[]){
            String a = "a";
            String b = "b";
            String c = "c";
            hanio(3,a,b,c);
    }
}

截圖:

image-20200113132055639

心情_2020011314:36,保衛處兼職。這個冬天有點想看雪。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM