;//用來存放皇后,轉換為二維矩陣,元素座標為(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 同樣的...