手把手帶你用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柱上,最后移到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)文章
SpringBoot結(jié)合Ajax實(shí)現(xiàn)登錄頁(yè)面實(shí)例
大家好,本篇文章主要講的是SpringBoot結(jié)合Ajax實(shí)現(xiàn)登錄頁(yè)面實(shí)例,感興趣的同學(xué)趕快來(lái)看一看,對(duì)你有幫助的話記得收藏一下2022-02-02
Java通過(guò)反射來(lái)打印類(lèi)的方法實(shí)現(xiàn)
本文主要介紹了Java通過(guò)反射來(lái)打印類(lèi)的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
詳解Java集合類(lèi)之HashTable,Properties篇
這篇文章主要為大家詳細(xì)介紹一下Java集合類(lèi)中HashTable和Properties的用法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,感興趣的可以了解一下2022-07-07
mybatis中使用InsertProvider注解報(bào)錯(cuò)解決全過(guò)程
這篇文章主要介紹了mybatis中使用InsertProvider注解報(bào)錯(cuò)解決全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
Java實(shí)現(xiàn)直接插入排序和折半插入排序算法示例
這篇文章主要介紹了Java實(shí)現(xiàn)直接插入排序和折半插入排序算法示例,文中對(duì)算法的思想和時(shí)間復(fù)雜度都有簡(jiǎn)單的講解,需要的朋友可以參考下2016-04-04
springboot整合druid及多數(shù)據(jù)源配置的demo
這篇文章主要介紹了springboot整合druid及多數(shù)據(jù)源配置的demo,本篇主要分兩部分 ①springboot整合druid的代碼配置,以及druid的監(jiān)控頁(yè)面演示;②對(duì)實(shí)際場(chǎng)景中多數(shù)據(jù)源的配置使用進(jìn)行講解,需要的朋友可以參考下2024-01-01
從零開(kāi)始:快速入門(mén)SpringBoot注解的精髓
Spring?Boot是一個(gè)用于快速構(gòu)建基于Spring框架的應(yīng)用程序的開(kāi)源框架,它通過(guò)使用注解來(lái)簡(jiǎn)化配置和開(kāi)發(fā)過(guò)程,使開(kāi)發(fā)人員能夠更加專(zhuān)注于業(yè)務(wù)邏輯的實(shí)現(xiàn),Spring?Boot提供了許多注解,用于定義和配置應(yīng)用程序的各個(gè)方面,需要的朋友可以參考下2023-10-10

