力扣解析 回溯演算法經典之N皇后問題

2021-10-03 12:51:54 字數 964 閱讀 9109

該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊:即任意兩個皇后都不能處於同一行、同一列或同一斜線上,求解符合條件的解的個數。

西洋棋的格仔數有64個,我們的任務是從中取8個,這是乙個排列組合的問題,暴力搜尋的次數是:

雖然能夠解決,但是明顯過於笨拙;

我們通過觀察和歸納,可以發現:

如果使得即任意兩個皇后都不能處於同一行、同一列或同一斜線上,那麼恰好每行,每列 都只有乙個皇后。

我們只考慮行和列的情況:

在第0行,皇后可擺放的位置有8種;

在第1行,皇后可擺放的位置有7種 ;

在第2行,皇后可擺放的位置有6種;

因此,在不考慮對角線的情況下,

列舉的全集為:8!=40320 種

較暴力窮舉優異的多,因此我們就從此入手 

我們可以用二維陣列表示棋盤格,但是會增加資料結構的複雜性,

我們可以充分利用陣列的下標和值來建立求解的資料結構。

我們定義乙個長度為8的陣列:

其下標代表行的編號;

其值代表列的編號;

這樣相關的比較操作就可以使用一維陣列進行

首先,我們需要遍歷棋盤的每一行;

在每一行,我們要嘗試每一列;

每一次列的嘗試之後,都要檢查是否符合條件

如果符合,走下一行(遞迴呼叫此演算法);

為啥能返回?因為都執行完了,本層被請出棧了,就到上一層了(上一層的列迴圈還沒有做完,因此上一層不會被從棧裡面請出去);

//cur 當前行

public static void que(int cur) else else {

//i代表當前列

for(int i=0;i結果:

回溯法 經典n皇后問題

太懶了直接搬了 演算法框架 迭代版int a n i 初始化a n i 1 while i 0 有路可走 and 未達到目標 還沒有回溯到頭 else if a i 在搜尋空間內 else 遞迴版 int a n try int i 例如hdoj的2553就是經典回溯法 ac 注意要打表不然會tle...

回溯演算法之 N皇后問題

n皇后 include include define max 15 int n n queen int cur cur row int a max the ith row s queen put in the a i th column int tot 0 total nums cur 為當前遍歷到...

回溯演算法之n皇后問題

n皇后問題 輸出8皇后問題所有結果。輸入 n 棋盤的行列 輸出 每個結果第一行是no n 的形式,n表示輸出的是第幾個結果 下面8行,每行8個字元,a 表示皇后,表示空格。不同的結果中,先輸出第乙個皇后位置靠前的結果 第乙個皇后位置相同,先輸出第二個皇后位置靠前的結果 依次類推。輸入樣例 8 輸出樣...