八皇后和漢諾塔問題

2021-09-25 07:29:08 字數 2630 閱讀 1410

三個盤子的漢諾塔問題 需要7步。怎麼移動大家都清楚。

四個盤子的漢諾塔問題 需要15步 怎麼分析呢,把中間的看作目標柱子,把最大的移到右邊,然後就是和三個盤子的是一樣的分析了

a4=a3+a3+1.其實我們分析漢諾塔問題可以看作第n個和前n-1個兩部分,一共就三個步驟:

把n-1個盤子移動到緩衝區。

把第n個盤子移動到終點。

然後把緩衝區的n-1個盤子也移動到終點。

else

所以這就是它的回溯步驟我個人覺得是看作兩個整體來能簡單易懂點,硬推公式的話感覺有點僵硬。

#include#include#include#include#includeusing namespace std;

void hannuotower(int n,char begin,char buffer,char end)

for(int column=0;column<8;column++)

map[row][column]=0;}}

這段**雖短,但真的非常非常重要,是整個演算法的核心和靈魂):

第一次進來,row=0,意思是要在第一行擺皇后,只要傳進來的row引數不是8,表明還沒出結果,就都不會走if裡面的return,那麼就進入到for迴圈裡面,column從0開始,即第一列。此時第一行第一列肯定合乎要求(即check方法肯定通過),能放下皇后,因為還沒有任何其他皇后來干擾。

關鍵是check方法通過了之後,在if裡面又會呼叫一下自己(即遞迴),row加了1,表示擺第二行的皇后了。第二行的皇后在走for迴圈的時候,分兩種情況,第一種情況:for迴圈沒走到頭時就有通過check方法的了,那麼這樣就順理成章地往下走再呼叫一下自己(即再往下遞迴),row再加1(即擺第三行的皇后了,以此類推)。第二種情況:for迴圈走到頭了都沒有通過check方法的,說明第二行根本乙個皇后都擺不了,也觸發不了遞迴,下面的第三行等等後面的就更不用提了,此時控制第一行皇后位置的for迴圈column加1,即第一行的皇后往後移一格,即擺在第一行第二列的位置上,然後再往下走,重複上述邏輯。

注意,一定要新增清零的**,它只有在皇后擺不下去的時候會執行清0的動作(避免髒資料干擾),如果皇后擺放很順利的話從頭到尾是不會走這個請0的動作的,因為已經提前走if裡面的return方法結束了。

我的理解:首先我們來看一下遞迴出口遞迴出口是row>7代表8行已經放置好位置,直接輸出ans就可以。我們從row=0開始分析,row=0,column=0,此時第一行第一列肯定滿足要求,(滿足check函式)進入if語句,如果滿足check函式,則標記這個位置已經走過,接下來再次遞迴row+1,即第走到第二行,不會進行清零操作,依次論推,如果說check不滿足條件的話,則說明這一列不可以,那麼column++,直到滿足條件為止進入這個if語句裡面,呼叫自己然後行數加一,如果說for迴圈走到頭了都沒有通過check方法的,則說明這一行不行,我們可以假設這個是第二行,也就是說走到頭第二行都沒有合適的位置放皇后,也觸發不了遞迴,下面的第三行以及後面的所有行都不用提了,此時控制第一行皇后位置的for迴圈column加1,即第一行的皇后往後移一格,看不懂的話可以模擬下四皇后的走法。

但是我有幾個疑惑?

第一點,row=0,col=0滿足條件,進入if語句,遞迴呼叫,row+1.

第二點 row=1,col=0;不滿足條件,col++,直到滿足check條件然後進入迴圈。

第三點 假如for迴圈走完的話,也沒有一列是滿足條件的,我們假設第二行沒有合適位置,那麼說明第一行的起始位置選擇錯誤,那麼我們起始位置為第一行第二列,依次進行下面的操作似乎感受到了回溯的魅力。

第四點 也就是我的疑惑點,清零操作,皇后擺不下去進行清0操作,但是不是擺不下去根本進入不了這個if語句?如何清零,而且清零的擺放位置是在迴圈內還是迴圈外,感覺執行結果並沒有什麼區別??有啥區別??????

回來問了舍友終於懂了,

for(int column=0;column<8;column++)

//  map[row][column]=0;清零放在這一塊的作用和上一處的作用有點區別但是總體區別不大,這個是對每乙個不合法的位置進        行清0,操作的清0次數可能比放在裡面多一些,但是總體差別不大。

}#include#include#includeusing namespace std;

const int maxn=10;

int map[maxn][maxn];

int ans;

void printqueen()

for(int i=k-1,m=j+1;i>=0&&m<=7;i--,m++)

return true;

}void findqueue(int row)

for(int column=0;column<8;column++)

// map[row][column]=0;

}}int main()

終於算是搞懂八皇后和漢諾塔了,一年前一臉懵逼,現在完美解決。

漢諾塔問題

問題 假設有3個分別命名為x,y,z的寶塔,在塔座x上插有n個直徑大小各不相同,從小到大編號為1,2,3。n的圓盤。現要求將x軸上的n個圓盤移至塔座z上 並仍然按同樣的順序疊排,圓盤移動時必須遵循下列規則 1.每次只能移動乙個圓盤 2.圓盤可以插在x,y和z中的任一塔座上 3.任何時刻都不能將乙個較...

漢諾塔問題

問題是 印度的乙個古老的傳說。開天闢地的神勃拉瑪在乙個廟裡留下了三根金剛石的棒,第一根上面套著64個圓的金片,最大的乙個在底下,其餘乙個比乙個小,依次疊上去,廟裡的眾僧不倦地把它們乙個個地從這根棒搬到另一根棒上,規定可利用中間的一根棒作為幫助,但每次只能搬乙個,而且大的不能放在小的上面。解答結果請自...

漢諾塔問題

漢諾塔如下圖所示 需要我們完成的事情是把盤子移動到c,規則就不贅述了。演算法思想 總體來說是利用遞迴完成的。假設 1 a上只有乙個盤子,我們直接移動到c即可 2 a上有兩個盤子,我們把第二個盤子上面的所有盤子 此時只有乙個,比較容易 移動到b,再把第二個盤子移動到目的地c,最後把b上的盤子移動到c ...