Java 實現(xiàn)一個漢諾塔實戰(zhàn)練習(xí)
漢諾塔簡介:
我們想要實現(xiàn)的是 讓 A柱上的盤子,移動到C柱上
1層漢諾塔
2層漢諾塔
3層漢諾塔詳解圖
第一步
第二步
第三步
第四步
第五步
第六步
第七步
經(jīng)過上面的圖解,相比大家一定在一定程度了解到漢諾塔的游戲規(guī)則,以及怎么去玩。
總之 最終C柱上第一個盤子,是最大,最頂?shù)氖亲钚〉?,而且在操作過程中,前幾步就是為了讓三個柱子中最大的盤子移動到C柱上,
然后不斷,將它兩個柱子中最大盤子往上累加,(盤子從大到小,從下往上擺放)
而且盤子一多,你就會發(fā)現(xiàn)過程中間,除了最大的盤子,其余的盤子都會集中在 B柱上,這樣才能把 A 柱上最底下也是最大的盤子,移動到C上。
這是規(guī)律一
還有一個規(guī)律,在最大的盤子移動C柱上之后,第二個大的盤子要放在A柱上,其余盤子按照規(guī)則全部放在B柱上,
這樣第二大的盤子才能移動到最大的盤子上
說白了,盤子再多,也要按照上面兩個規(guī)律,才能完成整個游戲
那我把最大盤子上面的所有盤子看成一個整體,放在B柱上,最大盤子移動到C柱上,把B柱上盤子直接蓋上去,不就行了,反正也就是重復(fù)那兩個規(guī)律而已
程序如下
import java.util.Scanner; public class Manuscript { static int times;// 移動次數(shù) public static void main(String[] args) { Scanner scanner = new Scanner(System.in); char A = 'A'; char B = 'B'; char C = 'C'; int n = scanner.nextInt(); game(n,A,B,C); scanner.close(); } public static void move(int disk,char M,char N){ System.out.println("第"+(++times)+"次移動,盤子"+disk+" "+M +"---->"+N); } public static void game(int n,char A,char B,char C){ if(n==1){ move(n,A,C);// 把A柱目前最大盤子放在C柱上,第一次肯定最大的那個 }else{ // 將 n-1 個 盤子 放到B柱子,注意ABC位置,再看看下面 move(n,A,C);,細細琢磨 game(n-1,A,C,B);// A B(C) C(B) move(n,A,C); // 把n-1 個盤子 放在C上,注意ACB位置 game(n-1,B,A,C);// A(B) B(A) C } } }
3層漢諾塔的輸出結(jié)果附圖(可以返回去看看,對一對)
有什么疑問,可以在下方討論,切記 不要自己帶入一個特別大數(shù)字去展開,帶入一個 1 ~3 ,了解規(guī)律就行。不主張展開,主張掌握規(guī)律(遞推公式)。
本文結(jié)束。
以上就是Java 實現(xiàn)一個漢諾塔實戰(zhàn)練習(xí)的詳細內(nèi)容,更多關(guān)于Java 漢諾塔的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java的idea連接mongodb數(shù)據(jù)庫的詳細教程
這篇文章主要介紹了Java的idea連接mongodb數(shù)據(jù)庫的詳細教程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11Java Lambda表達式與匿名內(nèi)部類的聯(lián)系和區(qū)別實例分析
這篇文章主要介紹了Java Lambda表達式與匿名內(nèi)部類的聯(lián)系和區(qū)別,結(jié)合實例形式分析了Java Lambda表達式與匿名內(nèi)部類功能、用法、區(qū)別及操作注意事項,需要的朋友可以參考下2019-10-10springboot+springsecurity如何實現(xiàn)動態(tài)url細粒度權(quán)限認證
這篇文章主要介紹了springboot+springsecurity如何實現(xiàn)動態(tài)url細粒度權(quán)限認證的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06