該問題是國際西洋棋棋手馬克斯·貝瑟爾於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 輸出樣...