漢諾塔模型推廣 n盤4塔問題

2022-08-28 10:00:14 字數 1609 閱讀 9434

經典漢諾塔問題理解方法:

經典漢諾塔問題**(當三個塔時,答案為 2n - 1)d[n]表示求解該n盤3塔問題的最小步數 顯然有d[n]=2*d[n-1]+1即把前n-1個盤子從a柱(繞過c柱)移動到b柱,然後把第n個盤子從a柱移動到c柱,最後把前n-1個盤子從b柱(繞過a柱)移動到c柱

#include using

namespace

std;

void hanoi(int n, char a, char b, char

c)

else

}int

main()

漢諾塔四塔問題:

【題意】

本題大意是求n個盤子四座塔的hanoi問題的最少步數。輸出n為1~12個盤子時各自的答案。

【分析】

漢羅塔改編的乙個小問題。

首先考慮n個盤子3座塔的經典hanoi問題,設d[n]表示求解該n盤3塔問題的最少步數:

①把前n-1個盤子從a柱移動到b柱(需要d[n-1]步)

②把第n個盤子從a柱移動到c柱   (需要1步)

③把前n-1個盤子從b柱移動到c柱(需要d[n-1]步)

顯然總計d[n]=2*d[n-1]+1此過程屬於dp+遞迴問題

那麼對於此問題,設f[n]表示求解n盤4塔問題的最小步數:

①把i個盤子在4塔模式下移動到b柱(需要f[i]步)

②把n-i個盤子在3塔模式下移動到d柱   (需要d[n-i]步)

③把i個盤子在4塔模式下移動到d柱(需要f[i]步)

考慮所有可能的i取最小值得:f[n]=min,i屬於[1, i)

#include #include 

using

namespace

std;

intmain()

memset(f,

0x3f, sizeof

f); f[

0] = 0

;

for (int i = 1; i <= 12; i ++)

for (int j = 0; j < i; j ++)

f[i] = min(f[i], f[j] * 2 + d[i -j]);

for (int i = 1; i <= 12; i ++ ) cout << f[i] <

return0;

}

四盤漢諾塔

在傳統的漢諾塔遊戲中多加了乙個盤子。問把n層的漢諾塔從第乙個盤子移到第四個盤子需要多少步?要將n層從1號盤移動到3號盤,需要分為三步 1 把n 1層從1號移動到2號 n層要移動到3號,為了不影響n層的移動只能移動到2號 2 把n層從1移動到3號 3 把n 1層從2號移到3號 把第乙個步驟又能細分成類...

漢諾塔(梵塔)問題

漢諾塔 梵塔 問題幾乎是所有的初學程式設計的人遇到的問題,這個問題很好的運用了遞迴的特性,將原來看起來不好解決的問題變得異常簡單,而且很容易理解。問題所有的人都知道就不描述了,很簡單且有注釋就不解釋了 include using namespace std int cnt 1 step計數 void...

漢諾塔問題(Hanoi塔)

1.將from柱最上面的movesum 1個圓盤移動到by柱 借助to柱 2.將from柱上剩下的那1個圓盤直接移動到to柱 3.將by柱上的movesum 1個圓盤移動到to柱 借助from柱 int sumofplates 4 總的盤子數目 int sum 3 初始時各柱子上盤子數目 enum ...