設盤子編號為1~n,編號大的尺寸大,有三根柱子1~3。
1、輸出初始局面(所有盤子都在1號柱子)到終止局面(所有盤子都在3號柱子)的最優方案。
時間複雜度:ο(2^n)
2、輸出最優方案中某一局面之前經過的步驟數。
時間複雜度:ο(n)
3、輸出當前局面(不一定是最優解的中間步驟)到終止局面的最優方案。
時間複雜度:ο(2^n)
4、輸出當前局面下,把所有盤子移動到任一根柱子的最優方案。
時間複雜度:ο(2^n)
5、輸出當前局面下,把所有盤子移動到任一根柱子的最優方案所需步數。
時間複雜度:ο(n)
易知,必定把 1~n-1 移動到 n 處
否則的話,需要至少 2^(n-1) 步,不會最優。
所以 n 所在位置就是 目標柱子
注意到如果 n、n-1、……、k+1 初始時都在同乙個根柱子上,那就不用再管它們了。
只需考慮 k、k-1、……、1
之所以要移動 i,要麼是為了給比它編號大的盤子讓路,要麼是因為要把它移動到目標柱子。
所以,如果要把 i 移動到某根柱子 x,那麼 i-1、i-2、……、1 也應該移動到 柱子 x
總結:總結一下,對於求方案的問題,因為最壞情況下步驟數可以達到ο(2^n),所以以上原始碼在漸進意義上達到最優複雜度。
對於求步驟數(無須輸出方案),以上原始碼時間複雜度都是ο(n),由於輸入時間已達到ο(n),所以在漸進意義上也達到了最優複雜度。
怎麼理解漢羅塔問題 漢諾塔問題(三柱及四柱)詳解
漢諾塔 hanoi tower 又稱河內塔,傳說大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動乙個圓盤。問應該如何操...
python 遞迴 實現漢諾塔拆解方法 原始碼
提高python中遞迴深度 python中預設遞迴深度是100層 想要提高遞迴深度 import sys sys.setrecursionlimit 1000000 漢諾塔就是有三個針 x y z 針上面有圓盤 放在x上面 我們的目的就是將x上的圓盤放到z上面。實現 def hanoi n,x,y,...
使用棧實現漢諾塔求解 C 原始碼
漢諾塔的核心就是一句話,要把src的第n個碟子移動到dst,需要三步 1,把n 1個碟子移動到buffer 2,把第n個碟子移動到dst 3,把buffer中的碟子移動到dst實現的核心 如下 if n 0 完整 如下 include include include using namespace ...