經典遞推題。
解出 n (1<=n<=12) 個盤子 \(4\) 座塔的hanoi(漢諾塔)問題最少需多少步?(1到12每個答案分別佔一行)在原hanoi問題中 \(d[i]\) 表示 3座塔下 \(i\) 個盤子的最小步數。如果你還沒有忘記的話:
\[d[i]=d[i-1]*2+1
\]這個式子還是很顯然的。
我們設 \(f[i]\) 表示 4座塔下 \(i\) 個盤子的最小步數。 那麼有:
\[f[i]=\text\(1<=j<=i)
\]那我們來仔細康康這個式子,\(f[j]\) 指將 \(j\) 個盤子放在 \(b\) 塔上,剩下的盤子採用 3座塔全部放在 \(d\) 塔上,再把 \(b\) 塔上的 \(j\) 個盤子放在 \(d\) 塔上。
code
#include#define n 15
using namespace std;
int n;
int f[n],d[n];
int main()
printf("%d\n",f[i]);
} return 0;
}
理解了之後,我們可以來思考一下 \(n\) 個盤子 \(m\) 座塔的做法。
我們設 \(f[i][j]\) 為 \(i\) 座塔 ,\(j\) 個盤子的最少步數,那麼有:
\[f[i][j]=\text\
\]其實原理是一樣的。
睡個好覺吧,晚安!
hanoi塔問題的遞迴實現
一 背景故事 二 問題描述 假設有x,y,z三座塔座。在塔座x上有n個直徑各不相同 依次從小到大的編號為1,2.n的圓盤。現要求將x座上的盤子移動到z上,移動要求如下 1 一次只能移動乙個盤子。2 盤子只能插在x,y,z的某個塔座上。3 任何時刻不能將較大的盤子壓在較小的盤子上。如何移動盤子呢?當只...
Hanoi塔 分治法的應用
1.分治法 分治法的設計思想是將乙個難以直接解決的大問題分解成一些規模較小的相同問題,以便各個擊破,分而治之。一般來說,分治演算法在每一層遞迴上都有3個步驟 1 分解 將問題分解成一系列子問題。2 求解 遞迴地求解各子問題。若子問題足夠小,則直接求解。3 合併 將子問題的解合併成原問題的解。2.ha...
關於對hanoi塔遞迴的理解
對遞迴的理解的要點主要在於放棄 放棄你對於理解和跟蹤遞迴全程的企圖,只理解遞迴兩層之間的交接,以及遞迴終結的條件。想象你來到某個熱帶叢林,意外發現了十層之高的漢諾塔。正當你苦苦思索如何搬動它時,林中出來乙個土著,毛遂自薦要幫你搬塔。他名叫二傻,戴著乙個草帽,草帽上有乙個2字,號稱會把一到二號盤搬到任...