演算法設計與分析 N皇后(回溯演算法)

2021-10-03 19:43:24 字數 1133 閱讀 6673

回溯vs遞迴

很多人認為回溯和遞迴是一樣的,其實不然。在回溯法中可以看到有遞迴的身影,但是兩者是有區別的。

回溯法從問題本身出發,在包含問題的所有可能解的解空間樹中,從根結點出發,按照深度優先遞迴從問題的結果出發,例如求 n!,要想知道 n!的結果,就需要知道 n*(n-1)! 的結果,而要想知道 (n-1)! 結果,就需要提前知道 (n-1)*(n-2)!。這樣不斷地向自己提問,不斷地呼叫自己的思想就是遞迴。

回溯和遞迴唯一的聯絡就是,回溯法可以用遞迴思想實現。

n皇后問題

在n x n的棋盤上擺放n個皇后,而且n個皇后中的任意兩個是不能處於同一行、同一列、或同一斜線上。

【分析】因為n皇后不能在同行,同列, 同斜線。

每一行放乙個皇后,就解決了不在同行的問題。

在第i行的時候,遍歷n列,試探位置。和之前所有行放的位置進行比較。

比較列:當前列 col 不等於之前所有列。 即col != arr[i] 。

比較斜線, 因為不再同一斜率為1或者-1的斜線。(row - i) / (col - arr[i]) != 1 或 -1可以取巧用絕對值函式:abs(row-i) != abs(col-arr[i]) 。

public class nqueen 

// row col i arr[i]

public boolean check(int row, int col)

return true;

}public void findnqueen(int k)

for (int i = 1; i <= n; i++) }}

public static void main(string args)

}

當n=8時,輸出結果為92。

N皇后 回溯演算法

res 用於儲存最終結果 defdfs n,x,arr,cols,diag1,diag2 if x n else 對於每一行x,迴圈搜尋不同的列y值 for y in range n if check x,y 合法 更新合法性判斷引數 更新arr,cols,diag1,diag2等引數 dfs n,...

回溯 皇后 演算法筆記 回溯演算法 N皇后問題

n 皇后問題研究的是如何將 n 個皇后放置在 n n 的棋盤上,並且使皇后彼此之間不能相互攻擊。上圖為 8 皇后問題的一種解法。給定乙個整數 n,返回所有不同的 n 皇后問題的解決方案。每一種解法包含乙個明確的 n 皇后問題的棋子放置方案,該方案中 q 和 分別代表了皇后和空位。示例 輸入 4 輸出...

演算法設計與分析 n皇后問題

在 n n 的棋盤上擺放n個皇后,使其不能互相攻擊,即任意兩個皇后不能處於同一行 同一列或者同一斜線上。遇到的問題 雙重迴圈內外層弄反了,如果先判斷擺過的棋子,那麼第一遍連迴圈都進不去。同樣,dfs語句也要放在內層迴圈外部。應該先大致判斷這一行能放在第幾列,再來判斷是否衝突。如下 include i...