你對經典的hanoi塔問題必定已經很熟悉了。有三根柱子,n個大小不一的圓盤,要求大盤不能壓在小盤上,初始時n個圓盤都在第一根柱子上,最少要多少步才能挪到最後一根柱子上?
如今咱們來將hanoi塔擴展一下,由三根柱子擴展到四根柱子,其他規則不變。例如,3個圓盤,四根柱子A到D,初始時圓盤都A柱上,咱們用五步就能夠將圓盤都挪到D柱上:
第一步:將圓盤1從A挪到B;
第二步:將圓盤2從A挪到C;
第三步:將圓盤3從A挪到D;
第四步:將圓盤2從C挪到D;
第五步:將圓盤1從B挪到D。
你的任務是寫一個程序求解四柱子hanoi塔問題最少要多少步能夠解決。spa
輸入只有一行,爲一個正整數n。(1<=n<=1000)code
輸出爲一個正整數,表明n盤四柱子hanoi塔問題最少要多少步能夠解決。ip
在作經典漢諾塔問題的時候,咱們是用遞推求出n個盤子時的步數的,咱們作這道題的時候也就類比,嘗試是否可以遞推解決問題
如下是前10個數的表input
盤子數 | 步數 |
---|---|
1 | 1 |
2 | 3 |
3 | 5 |
4 | 9 |
5 | 13 |
6 | 17 |
7 | 25 |
8 | 33 |
9 | 41 |
10 | 49 |
... | ... |
觀察上面的表格,咱們發現,從1個盤子到2個盤子與2個到3個各增長了2步即\(2^{1}\)步;從3個到4個、從4個到5個與從5個到6個各增長了4步即\(2^{2}\)步,以此類推,咱們作出猜測it
其中\(k \in N^{*}\)且是遞增的
對於\(2^{k}\)會加(k+1)次
數據\(n \leqslant 1000\)因此直接遞推就好io
#include <cstdio> #include <algorithm> #define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout); using namespace std; int n,cnt,num,i; long long add,f[1001]; int main() { open("hanoi"); scanf("%d",&n); f[1]=1;f[2]=3;f[3]=5; add=4;cnt=3;num=3; for (i=4;i<=n;i++) { f[i]=f[i-1]+add; cnt--; if (!cnt) cnt=++num,add*=2; } printf("%lld",f[n]); return 0; }