漢諾塔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漢諾塔iii#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;
}
只允許先從中間過渡。那麼設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漢諾塔iv#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;
}
和ⅲ類似,如果允許最大的放上面,則只需要前i-1從a->b,i從a->b->c,前i-1從b->c。所以跟上面比只有a[i]=2*b[i-1]+2不一樣。
view code
#include #include漢諾塔vi#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;
}
水題本性。允許不按最優步驟走,計算有多少種序列。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 最裸的弄懂當然是遠遠不夠...