經典遞迴 N皇后問題

2021-09-25 06:31:06 字數 1336 閱讀 6280

;//用來存放皇后,轉換為二維矩陣,元素座標為(i, q[i])

int n =4;

void

nqueen

(int k)

;int

main()

void

nqueen

(int k)

for(

int i =

0; i < n;

++i)}if

(j == k)

}}首先盯著第二個 for_loop 看:

for

(int i =

0; i < n;

++i)

}

函式的遞迴發生在這個for迴圈內,而這個for迴圈又是幹啥的呢?由i的變化範圍,顯然可以看出,這個迴圈是用來對每一嘗試,該列的皇后擺在第i行是否合適

由於每次遞迴都發生在這個迴圈內,所有從當前元素(k, i)通過nqueen(k+1)這個口子出發向產生的情況(執行到頭 ------- 有的序列可以走到頭(即k == n進入第乙個迴圈return;出來),有的走不到頭,半途而返),等它們都執行完以後(萬劍歸一的趕腳),又會返回這個口子,繼續執行下去,繼續for迴圈,開始嘗試放在第i+1行的各種情況…第0列是這樣,第1列是這樣…一直到第n-1列都是這樣

由於第0列,是第一批拓荒者,所有的i都可以放皇后,所以又這些i向後延伸出去,每一層,淘汰掉一部分(由於規則的限制),最後到了第n-1列,只有個別極其幸運的倖存者(額,好像只有乙個了吧?),能夠到達nqueen(k+1),進入以後,噹噹噹噹~成就達成,k == n, 於是乎,它帶著整個一隊(他的前繼們),進入了神秘的第乙個for迴圈,把它們的名字cout出來,這就是戰士最後的榮譽吧(什麼鬼…),最後return出來。

i = n - 1時,整個迭代截止

遞迴經典問題 N皇后問題

n皇后問題是指在乙個n n的西洋棋棋盤上,有n個棋子,這n個棋子均不在同一行,同一列,同一對角線上,請問一共有幾種排列方式?因為每列都要有棋子,所以只要把每一列的棋子所在的行數排下來就行了,比如第一列到第五列棋子所在的行數依次是24135,然後只要檢視每種方法是否滿足要求就行了。void gener...

遞迴實現n(經典的8皇后問題)皇后的問題

問題描述 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在8 8的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上,此問題進而可以推廣為n皇后的問題。解題思路 n n的矩陣,遞迴每乙個點,當皇后數量達到n的時候,進行判斷...

n皇后問題 遞迴

遞迴回溯深度優先搜尋解決n皇后問題 用三個陣列b,c,d分別記錄棋盤上的n個列,2n 1個主對角線和2n 1個負對角線的占用情況。用i,j表示皇后所在的行列,同一主對角線上的行列下標的差一樣,若用表示式i j編號,則是 n 1 n 1,所以用表示式i j n對主對角線編號,範圍是1 2n 1 同樣的...