Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:漢諾塔問(wèn)題 Hanoi
更新時(shí)間:2015年06月20日 11:17:32 投稿:junjie
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:漢諾塔問(wèn)題 Hanoi,本文直接給出實(shí)現(xiàn)代碼,代碼中包含大量注釋,需要的朋友可以參考下
/** * 漢諾塔大學(xué)的時(shí)候就學(xué)過(guò),但是根本沒(méi)搞明白,唯一知道的就是要用遞歸的方法來(lái)求解。 * 問(wèn)題描述: * 有三根桿子A,B,C。A桿上有N個(gè)(N>1)穿孔圓盤(pán),盤(pán)的尺寸由下到上依次變小。 * 要求按下列規(guī)則將所有圓盤(pán)移至C桿: * 1.每次只能移動(dòng)一個(gè)圓盤(pán); * 2.大盤(pán)不能疊在小盤(pán)上面。 * 提示:可將圓盤(pán)臨時(shí)置于B桿,也可將從A桿移出的圓盤(pán)重新移回A桿, * 但都必須尊循上述兩條規(guī)則。 * 問(wèn):如何移?最少要移動(dòng)多少次? * 解決方法: * 假設(shè)只有2個(gè)盤(pán)子,柱子分別是A, B, C柱。那么只需要三步就可以把他們從A柱移到C柱, * 這三步是A->B, A->C, B->C。 * 如果盤(pán)子數(shù)n超過(guò)2呢,我們就可以把這些盤(pán)子看成由最下面的那個(gè)盤(pán)子和 上面n-1個(gè)盤(pán)子 兩部分, * 這兩部分同樣可以用上面的三步實(shí)現(xiàn)移動(dòng)。 * 也就是說(shuō)我們可以通過(guò)遞歸地調(diào)用上面的步驟實(shí)現(xiàn)將所有n個(gè)盤(pán)子從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 盤(pá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矩陣連乘問(wèn)題(動(dòng)態(tài)規(guī)劃)算法實(shí)例分析
- Java基于動(dòng)態(tài)規(guī)劃法實(shí)現(xiàn)求最長(zhǎng)公共子序列及最長(zhǎng)公共子字符串示例
- Java動(dòng)態(tài)規(guī)劃之硬幣找零問(wèn)題實(shí)現(xiàn)代碼
- Java動(dòng)態(tài)規(guī)劃之編輯距離問(wèn)題示例代碼
- Java面試之動(dòng)態(tài)規(guī)劃與組合數(shù)
- Java算法之最長(zhǎng)公共子序列問(wèn)題(LCS)實(shí)例分析
- 淺談java實(shí)現(xiàn)背包算法(0-1背包問(wèn)題)
- Java實(shí)現(xiàn)的猴子吃桃問(wèn)題算法示例
- Java基于分治算法實(shí)現(xiàn)的棋盤(pán)覆蓋問(wèn)題示例
- java動(dòng)態(tài)規(guī)劃算法——硬幣找零問(wèn)題實(shí)例分析
相關(guān)文章
Java函數(shù)式編程(三):列表的轉(zhuǎn)化
這篇文章主要介紹了Java函數(shù)式編程(二):列表的轉(zhuǎn)化,lambda表達(dá)式不僅能幫助我們遍歷集合,并且可以進(jìn)行集合的轉(zhuǎn)化,需要的朋友可以參考下2014-09-09Java 生成任意長(zhǎng)度的驗(yàn)證碼過(guò)程解析
這篇文章主要介紹了Java 生成任意長(zhǎng)度的驗(yàn)證碼過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10Mybatis操作數(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-04java:java.lang.ExceptionInInitializerError報(bào)錯(cuò)解決過(guò)程
這篇文章主要給大家介紹了關(guān)于java:java.lang.ExceptionInInitializerError報(bào)錯(cuò)的解決過(guò)程,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包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10