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