手把手帶你用java搞定漢諾塔
什么是漢諾塔
漢諾塔問題是一個經(jīng)典的問題。漢諾塔(Hanoi Tower),又稱河內(nèi)塔,源于印度一個古老傳說。
大梵天創(chuàng)造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。
大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規(guī)定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動一個圓盤。問應(yīng)該如何操作?
問題剖析
我們假設(shè)圓盤數(shù)量為n,圓盤初始放在A柱上,最后移到C柱。
n=1
移動方法:A -> C
n=2
移動方法:A -> B A -> C B -> C
n=3
移動方法:A -> C A -> B C -> B A -> C B -> A B -> C A -> C
小結(jié)
通過這上面三個情況,我們可以知道:
- 當(dāng)紅色圓盤上面沒有其他圓盤的時候,就直接把紅色圓盤移到C柱上。
- 當(dāng)紅色圓盤上面有其他圓盤的時候,先把其他圓盤移到B柱上,然后再將紅色圓盤移到C柱上。在把B柱上紫色圓盤上面的其他圓盤移到A柱,接著再將紫色圓盤移到C柱上。然后再次循環(huán)。
例如當(dāng)n=4時,
Java代碼實現(xiàn)
public class TestDemo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); hanoiTower(n,'A','B','C'); } public static void hanoiTower(int n,char A,char B,char C) { if(n < 2) { move(A,C); } else { hanoiTower(n - 1,A,C,B); move(A,C); hanoiTower(n - 1,B,A,C); } } public static void move(char src,char des) { System.out.println(src + " -> " + des); } }
例如輸入3,結(jié)果為:
代碼講解
move函數(shù)
public static void move(char src,char des) { System.out.println(src + " -> " + des); }
src表示起始圓盤所在的柱子,des表示該圓盤需要移動到的柱子。
hanoiTower函數(shù)
public static void hanoiTower(int n,char A,char B,char C) { if(n < 2) { move(A,C); } else { hanoiTower(n - 1,A,C,B); move(A,C); hanoiTower(n - 1,B,A,C); } }
hanoiTower的第一個參數(shù),代表還有n個圓盤需要移動,A代表起始圓盤所在的柱子,C代表該圓盤所要移動到的柱子,B代表圓盤移動時所經(jīng)歷的中間柱子。
例如n=3時,先需要把上面兩個圓盤經(jīng)過一系列的移動,全部移動到B柱上,所以就得調(diào)用hanoiTower(2,A,C,B);然后再將A柱上唯一的一個圓盤移動到C柱上,所以調(diào)用move(A,C);然后再將B柱上除最下面的圓盤以外的圓盤移動到A柱上,然后再重復(fù)這個步驟,直到所有的圓盤都移動到C柱為止。
所以調(diào)用hanoiTower(2,B,A,C);
附:C語言實現(xiàn)漢諾塔
#include<stdio.h> void Move(char src, char des) { printf("%c -> %c", src, des); printf("\n"); } void HanoiTower(int n, char A, char B, char C) { if (n == 1) { Move(A, C); } else { HanoiTower(n - 1, A, C, B); Move(A, C); HanoiTower(n - 1, B, A, C); } } int main() { int n = 0; scanf("%d", &n); HanoiTower(n, 'A', 'B', 'C'); return 0; }
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Android、iOS和Java通用的AES128加密解密示例代碼
現(xiàn)在很多App在與服務(wù)器接口的請求和響應(yīng)過程中,為了安全都會涉及到加密和解密的問題,如果不加的話就會是明文的,即使加了GZIP也可以被直接解壓成明文。如果同時有Android和IOS的App的話、必須要保證加密和解密的算法一致、不然后臺沒法處理,下面通過這篇文章學(xué)習(xí)下。2016-11-11把Java程序轉(zhuǎn)換成exe,可直接運行的實現(xiàn)
這篇文章主要介紹了把Java程序轉(zhuǎn)換成exe,可直接運行的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09詳解Java去除json數(shù)據(jù)中的null空值問題
這篇文章主要介紹了詳解Java去除json數(shù)據(jù)中的null空值問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Java異常中toString()和getMessage()區(qū)別
在java異常體系中,要打印異常信息,可以通過:e.getMessage() 、 e.toString() e.printStackTrace() 等方法打印,本文主要介紹了Java異常中toString()和getMessage()區(qū)別,具有一定的參考價值,感興趣的可以了解一下2024-01-01關(guān)于Mybatis-Plus字段策略與數(shù)據(jù)庫自動更新時間的一些問題
這篇文章主要介紹了關(guān)于Mybatis-Plus字段策略與數(shù)據(jù)庫自動更新時間的一些問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java8中List轉(zhuǎn)換String字符串幾種方式
這篇文章主要給大家介紹了關(guān)于Java8中List轉(zhuǎn)換String字符串的幾種方式,在實際開發(fā)中經(jīng)常遇到List轉(zhuǎn)為String字符串的情況,文中給出了幾種方法的示例代碼,需要的朋友可以參考下2023-07-07J2SE基礎(chǔ)之命令行中編寫第一個 Hello World
“Hello World”程序指的是只在計算機屏幕上輸出“Hello, World!”(意為“世界,你好!”)這行字符串的計算機程序。hello world作為所有編程語言的起始階段,占據(jù)著無法改變的地位,所有的編程第一步就在于此了!經(jīng)典之中的經(jīng)典!hello world!2016-05-05elasticsearch啟動警告無法鎖定JVM內(nèi)存
今天小編就為大家分享一篇關(guān)于elasticsearch啟動警告無法鎖定JVM內(nèi)存,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03