在 n*n 的棋盤上擺放n個皇后,使其不能互相攻擊,即任意兩個皇后不能處於同一行、同一列或者同一斜線上。遇到的問題:
雙重迴圈內外層弄反了,如果先判斷擺過的棋子,那麼第一遍連迴圈都進不去。同樣,dfs語句也要放在內層迴圈外部。應該先大致判斷這一行能放在第幾列,再來判斷是否衝突。
**如下:
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int cnt=0;
int r[
100]
;//r[i]存放第i行所在列數
bool visit[
100]
;void
dfs(
int m,
int n)
for(
int j=
0;jif(flag)}}
intmain()
return0;
}
演算法設計與分析 N皇后(回溯演算法)
回溯vs遞迴 很多人認為回溯和遞迴是一樣的,其實不然。在回溯法中可以看到有遞迴的身影,但是兩者是有區別的。回溯法從問題本身出發,在包含問題的所有可能解的解空間樹中,從根結點出發,按照深度優先遞迴從問題的結果出發,例如求 n!要想知道 n!的結果,就需要知道 n n 1 的結果,而要想知道 n 1 結...
n皇后問題(分析)
這道題需要用到回溯演算法,現在在這裡先簡單的介紹一下這個演算法 回溯演算法也叫試探法,它是一種系統地搜尋問題的解的方法。回溯演算法的基本思想是 從一條路往前走,能進則進,不能進則退回來,換一條路再試。用回溯演算法解決問題的一般步驟為 1 定義乙個解空間,它包含問題的解。2 利用適於搜尋的方法組織解空...
演算法 n皇后問題
題目描述 乙個 n n 的棋盤,要在上面放 n 個皇后。規則 兩個皇后之間如果是同列 同行 同對角線它們會互相攻擊。也就 是 說 棋盤上的任意兩個皇后不能為同列 同行 同對角線。演算法思想 q j 表示乙個解的空間即儲存一組可行解的陣列,j表示行數,q j 的值表示j行可以放置皇后的所在列數,根據任...