Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:漢諾塔問題 Hanoi
更新時(shí)間:2015年06月20日 11:17:32 投稿:junjie
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:漢諾塔問題 Hanoi,本文直接給出實(shí)現(xiàn)代碼,代碼中包含大量注釋,需要的朋友可以參考下
/**
* 漢諾塔大學(xué)的時(shí)候就學(xué)過,但是根本沒搞明白,唯一知道的就是要用遞歸的方法來求解。
* 問題描述:
* 有三根桿子A,B,C。A桿上有N個(gè)(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。
* 要求按下列規(guī)則將所有圓盤移至C桿:
* 1.每次只能移動(dòng)一個(gè)圓盤;
* 2.大盤不能疊在小盤上面。
* 提示:可將圓盤臨時(shí)置于B桿,也可將從A桿移出的圓盤重新移回A桿,
* 但都必須尊循上述兩條規(guī)則。
* 問:如何移?最少要移動(dòng)多少次?
* 解決方法:
* 假設(shè)只有2個(gè)盤子,柱子分別是A, B, C柱。那么只需要三步就可以把他們從A柱移到C柱,
* 這三步是A->B, A->C, B->C。
* 如果盤子數(shù)n超過2呢,我們就可以把這些盤子看成由最下面的那個(gè)盤子和 上面n-1個(gè)盤子 兩部分,
* 這兩部分同樣可以用上面的三步實(shí)現(xiàn)移動(dòng)。
* 也就是說我們可以通過遞歸地調(diào)用上面的步驟實(shí)現(xiàn)將所有n個(gè)盤子從A柱移動(dòng)到C柱。
*/
package al;
public class Hanoi {
public static void main(String[] args) {
Hanoi hanoi = new Hanoi();
hanoi.move(3, 'A', 'B', 'C');
}
/**
* @author
* @param n 盤子數(shù)目
* @param from 起始柱子
* @param temp 中間柱子
* @param to 目標(biāo)柱子
*/
public void move(int n, char from, char temp, char to) {
if(n == 1) {
System.out.println("Move 1 plate from " + from + " to " + to);
} else {
move(n-1, from, to, temp);
move(1, from, temp, to);
move(n-1, temp, from, to);
}
}
}
您可能感興趣的文章:
- Java矩陣連乘問題(動(dòng)態(tài)規(guī)劃)算法實(shí)例分析
- Java基于動(dòng)態(tài)規(guī)劃法實(shí)現(xiàn)求最長公共子序列及最長公共子字符串示例
- Java動(dòng)態(tài)規(guī)劃之硬幣找零問題實(shí)現(xiàn)代碼
- Java動(dòng)態(tài)規(guī)劃之編輯距離問題示例代碼
- Java面試之動(dòng)態(tài)規(guī)劃與組合數(shù)
- Java算法之最長公共子序列問題(LCS)實(shí)例分析
- 淺談java實(shí)現(xiàn)背包算法(0-1背包問題)
- Java實(shí)現(xiàn)的猴子吃桃問題算法示例
- Java基于分治算法實(shí)現(xiàn)的棋盤覆蓋問題示例
- java動(dòng)態(tài)規(guī)劃算法——硬幣找零問題實(shí)例分析
相關(guān)文章
Java函數(shù)式編程(三):列表的轉(zhuǎn)化
這篇文章主要介紹了Java函數(shù)式編程(二):列表的轉(zhuǎn)化,lambda表達(dá)式不僅能幫助我們遍歷集合,并且可以進(jìn)行集合的轉(zhuǎn)化,需要的朋友可以參考下2014-09-09
Mybatis操作數(shù)據(jù)時(shí)出現(xiàn):java.sql.SQLSyntaxErrorException:?Unknown?c
這篇文章主要介紹了Mybatis操作數(shù)據(jù)時(shí)出現(xiàn):java.sql.SQLSyntaxErrorException:?Unknown?column?'XXX'?in?'field?list',需要的朋友可以參考下2023-04-04
java:java.lang.ExceptionInInitializerError報(bào)錯(cuò)解決過程
這篇文章主要給大家介紹了關(guān)于java:java.lang.ExceptionInInitializerError報(bào)錯(cuò)的解決過程,java.lang.ExceptionInInitializerError 是一個(gè)異常,表示在初始化一個(gè)類的靜態(tài)變量或靜態(tài)塊時(shí)發(fā)生了錯(cuò)誤,需要的朋友可以參考下2023-10-10
詳解如何將springboot項(xiàng)目導(dǎo)出成war包
這篇文章主要介紹了詳解如何將springboot項(xiàng)目導(dǎo)出成war包,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

