HDOJ 漢諾塔系列(遞推分析)

2022-06-01 20:36:09 字數 2368 閱讀 8612

漢諾塔v

設當有n個盤子時,第i個盤子從乙個柱子移到另乙個柱子需要移動的步數為f[n,p],則有:當n=p時(即p是最底下的那個盤子),f[n,p]=1;而當n!=p時,p要跟著上面n-1個盤子先移動到b柱子,等n移到c後再移到c柱子。所以此時f[n,p]=2*f[n-1,p]。

view code

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

long

long p_hanno(int n,int

p)int

main()

return0;

}

漢諾塔iii

只允許先從中間過渡。那麼設b[i]為i個盤子從兩邊(中間)移到中間(兩邊)(模擬計算一下發現兩個一樣的)的步數。

所以容易有a[i]=2*b[i-1]+1+2*b[i-1]+1+2*b[i-1]。(把i個盤子從a移到c需要先把前i-1個盤子a->b->c,再讓i移到b,再讓前i-1個盤子移動c->b->a,然後i從b->c,然後前i-1從a->b->c,完成)即,a[i]=6*b[i-1]+2;    而容易得到:b[i]=3*b[i-1]+1。

view code

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

long

long b(int

n)long

long a(int

n)int

main()

return0;

}

漢諾塔iv

和ⅲ類似,如果允許最大的放上面,則只需要前i-1從a->b,i從a->b->c,前i-1從b->c。所以跟上面比只有a[i]=2*b[i-1]+2不一樣。

view code

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

long

long b(int

n)long

long a(int

n)int

main()

return0;

}

漢諾塔vi

水題本性。允許不按最優步驟走,計算有多少種序列。n個盤子,每個盤子都可以選擇三個柱子,即3^n。

view code

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

long

long hanno6(int

n)int

main()

return0;

}

遞推遞迴 D 漢諾塔系列1

題目 解題思路 實在是學生愚鈍,看了半天題目就是沒看懂什麼意思,但是看樣例輸入與輸出之間可能跟三有關係,用計算機計算了一下3的29次方剛好是第三個輸出。然後就直接寫 了。include using namespace std int main long long i,j,n,k,a 1000 a 1...

奇怪的漢諾塔 遞推

漢諾塔問題,條件如下 1 這裡有a b c和d四座塔。2 這裡有n個圓盤,n的數量是恆定的。3 每個圓盤的尺寸都不相同。4 所有的圓盤在開始時都堆疊在塔a上,且圓盤尺寸從塔頂到塔底逐漸增大。5 我們需要將所有的圓盤都從塔a轉移到塔d上。6 每次可以移動乙個圓盤,當塔為空塔或者塔頂圓盤尺寸大於被移動圓...

漢諾塔系列專題(逐步理解遞推遞迴)

最裸的漢諾塔 第一步 把n 1個盤子移到b柱 第二步 把第n個柱子移到c柱 第三步 把n 1個盤子移到c盤 第一步和第三步是一樣的,如果只需要求最少的步數,可以不管中間步驟,用遞推直接寫出即可 核心 a 1 1 for int i 2 i n i a i 2 a i 1 1 最裸的弄懂當然是遠遠不夠...