分治算法實現(xiàn)漢諾塔問題

分治算法介紹

分治法是一種很重要的算法。字面上的解釋是“分而治之”租幕,就是把一個復(fù)雜的問題分成兩個或更多的相同或相似的子問題献雅,再把子問題分成更小的子問題……直到最后子問題可以簡單的直接求解退渗,原問題的解即子問題的解的合并梢卸。這個技巧是很多高效算法的基礎(chǔ)累魔,如排序算法(快速排序摔笤,歸并排序),傅立葉變換(快速傅立葉變換)……

分治算法可以求解的一些經(jīng)典問題

二分搜索

大整數(shù)乘法

棋盤覆蓋

合并排序

快速排序

線性時間選擇

最接近點對問題

循環(huán)賽日程表

漢諾塔

前面的幾種包括合并排序垦写,快速排序前面的幾篇文章我已經(jīng)整理過了吕世,今天主要是要講如何解決漢諾塔的問題的代碼實現(xiàn)的。

基礎(chǔ)步驟

治算法的基本步驟

分治法在每一層遞歸上都有三個步驟:

    分解:將原問題分解為若干個規(guī)模較小梯投,相互獨立命辖,與原問題形式相同的子問題
    解決:若子問題規(guī)模較小而容易被解決則直接解,否則遞歸地解各個子問題
    合并:將各個子問題的解合并為原問題的解分蓖。

分治算法

分治(Divide-and-Conquer(P))算法設(shè)計模式如下

image

其中|P|表示問題P的規(guī)模尔艇;n0為一閾值,表示當(dāng)問題P的規(guī)模不超過n0時么鹤,問題已容易直接解出终娃,不必再繼續(xù)分解。ADHOC(P)是該分治法中的基本子算法午磁,用于直接解小規(guī)模的問題P尝抖。因此,當(dāng)P的規(guī)模不超過n0時直接用算法ADHOC(P)求解迅皇。算法MERGE(y1,y2,…,yk)是該分治法中的合并子算法昧辽,用于將P的子問題P1 ,P2 ,…,Pk的相應(yīng)的解y1,y2,…,yk合并為P的解。

漢諾塔問題

漢諾塔的傳說

漢諾塔:漢諾塔(又稱河內(nèi)塔)問題是源于印度一個古老傳說的益智玩具登颓。大梵天創(chuàng)造世界的時候做了三根金剛石柱子搅荞,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規(guī)定咕痛,在小圓盤上不能放大圓盤痢甘,在三根柱子之間一次只能移動一個圓盤。

假如每秒鐘一次茉贡,共需多長時間呢塞栅?移完這些金片需要5845.54億年以上,太陽系的預(yù)期壽命據(jù)說也就是數(shù)百億年腔丧。真的過了5845.54億年放椰,地球上的一切生命,連同梵塔愉粤、廟宇等砾医,都早已經(jīng)灰飛煙滅。

思路分析

1.分解

  1. 如果只有一個盤衣厘,直接把A->c
  2. 如果我們有 n >= 2 情況如蚜,我們總是可以看做是兩個盤

1.最下邊的盤 2. 上面的盤

先把 最上面的盤 A->B

把最下邊的盤 A->C

把B塔的所有盤 從 B->C   

2.解決

分解為只有一個塔的情況。

3.合并

代碼實現(xiàn)

public class Hanoitower {

    public static void main(String[] args) {
        hanoiTower(5, 'A', 'B', 'C');
    }
    
    //漢諾塔的移動的方法
    //使用分治算法
    
    public static void hanoiTower(int num, char a, char b, char c) {
        //如果只有一個盤
        if(num == 1) {
            System.out.println("第1個盤從 " + a + "->" + c);
        } else {
            //如果我們有 n >= 2 情況影暴,我們總是可以看做是兩個盤 1.最下邊的一個盤 2. 上面的所有盤
            //1. 先把 最上面的所有盤 A->B错邦, 移動過程會使用到 c
            hanoiTower(num - 1, a, c, b);
            //2. 把最下邊的盤 A->C
            System.out.println("第" + num + "個盤從 " + a + "->" + c);
            //3. 把B塔的所有盤 從 B->C , 移動過程使用到 a塔  
            hanoiTower(num - 1, b, a, c);
        }
    }
}

結(jié)果:

image

大家可以參照以下這張圖自己去做實現(xiàn),

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坤检,一起剝皮案震驚了整個濱河市兴猩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌早歇,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讨勤,死亡現(xiàn)場離奇詭異箭跳,居然都是意外死亡,警方通過查閱死者的電腦和手機潭千,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門谱姓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刨晴,你說我怎么就攤上這事屉来。” “怎么了狈癞?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵茄靠,是天一觀的道長。 經(jīng)常有香客問我蝶桶,道長慨绳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮脐雪,結(jié)果婚禮上厌小,老公的妹妹穿的比我還像新娘。我一直安慰自己战秋,他們只是感情好璧亚,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脂信,像睡著了一般涨岁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吉嚣,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天梢薪,我揣著相機與錄音,去河邊找鬼尝哆。 笑死秉撇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秋泄。 我是一名探鬼主播琐馆,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恒序!你這毒婦竟也來了瘦麸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤歧胁,失蹤者是張志新(化名)和其女友劉穎滋饲,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喊巍,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡屠缭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了崭参。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呵曹。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖何暮,靈堂內(nèi)的尸體忽然破棺而出奄喂,到底是詐尸還是另有隱情,我是刑警寧澤海洼,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布跨新,位于F島的核電站,受9級特大地震影響贰军,放射性物質(zhì)發(fā)生泄漏玻蝌。R本人自食惡果不足惜蟹肘,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俯树。 院中可真熱鬧帘腹,春花似錦、人聲如沸许饿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陋率。三九已至球化,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓦糟,已是汗流浹背筒愚。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留菩浙,地道東北人巢掺。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像劲蜻,于是被迫代替她去往敵國和親陆淀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容