在傳統的漢諾塔遊戲中多加了乙個盤子。
問把n層的漢諾塔從第乙個盤子移到第四個盤子需要多少步?
要將n層從1號盤移動到3號盤,需要分為三步:
1:把n-1層從1號移動到2號(n層要移動到3號,為了不影響n層的移動只能移動到2號)
2:把n層從1移動到3號
3:把n-1層從2號移到3號
把第乙個步驟又能細分成類似的三步
直到當前移動的總層數為1,只需要一步,遞迴。
所以經典漢諾塔遊戲中,n層最小移動步數為
d[n] = d[n-1] + 1 + d[n-1]
d[1] = 1
經典漢諾塔有三個盤裝塔,在一次移動中,除了起始盤,只有兩個盤可以用於操作,所以
可以把經典n層諾貝塔的答案理解成:
在有兩個空位的情況下,移動一次n層塔需要的步數為d[n]。
那麼在四盤漢諾塔遊戲中,可以有三個空閒盤用於操作。
需要移動n層哈諾塔時,可以把上面的i層移動到乙個空盤中,剩下兩個空盤。
在剩下兩個空盤中移動n-i層,顯然為d[n-1]
所以四盤漢諾塔,n層的最小移動步數為
f[n] = f[i] + d[n-i] + f[i]
f[1] = 1
#include
using
namespace std;
#define ull unsigned long long
const
int maxn =15;
int d[maxn]
;int f[maxn]
;int
main()
f[1]=
1;for(
int i =
2; i <=
12; i++)}
for(
int i =
1; i <=
12; i++
)cout << f[i]
<< endl;
}
四柱漢諾塔
多柱漢諾塔的解析 題目鏈結 分析 現在有四根柱子a b c d,我們假設盤子從a移動到d,先把a的n個盤子拿出r個借助其他兩個柱子放到b上這是f n r 接著這個柱子就先不動,然後開始動a上剩下的r個盤子,現在b已經不能放這r個,我們只能通過c柱子把r個移動到d上去。這裡只用到了c柱子和目標柱子,所...
漢諾塔(四)(暴力)
時間限制 3000 ms 記憶體限制 65535 kb 難度 2 描述漢諾塔問題是乙個經典的問題,現在我們有 n 個柱子和 m 個編號 1 m 的球,我們現在要求把盡量多的球放在盡量少的柱子上,如果相鄰兩個球的和不是完全平方數的話球會相互排斥而無法接觸。注意 球必須從小到大放,每次只能放在其他球的上...
python 漢諾塔 Python漢諾塔
import turtle class stack def init self self.items def isempty self return len self.items 0 def push self,item def pop self return self.items.pop def ...