回溯法 n皇后問題

2021-09-10 12:56:33 字數 1125 閱讀 9194

問題描述:在nxn的棋盤上,放置彼此不受攻擊的n個皇后。

規則:皇后可以攻擊與之在同一行,同一列,同一斜線上的棋子。

以行為主導(不用再判斷是否同行了)

演算法設計:

(1)定義問題的解空間:問題解的形式為n元組:

分量xi表示第i個皇后放置在第i行,第xi列。

(2)解空間的組織結構:m叉樹

(3)搜尋解空間:

約束條件:

限界條件:不存在放置方案好壞的問題。

搜尋過程:從根開始,以深度優先搜尋的方式進行搜尋。根結點是活結點,並且是當前的擴充套件結點。

#include #include #define m 105

using namespace std;

int n;

int x[m];

int countn;

bool place(int t)

}return ok;

}void backtrack(int t) else

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

}int main()

演算法複雜度分析:

(1)時間複雜度:

每個結點需要擴充套件n個分支:

每分支都要判斷約束:

葉子個數

因此,時間複雜度為:

(2)空間複雜度:

x記錄可行解,因此為:o(n)

演算法優化擴充套件:

問題:解空間過大。

原因:使用了不同行作為顯約束,使用了不同列,不同斜線作為隱約束

改進:使用不同行,不同列作為顯約束,使用不同斜線作為隱約束,縮小解空間。此時解空間樹變為排列樹。

例如:x1=1,則x2不能等於1

x1=1,x2=2,則x3不能等於1,2

N 皇后問題 回溯法

n 皇后問題 在 n n 的棋盤上放置彼此不受攻擊的 n 個皇后,任意兩個皇后不同行 不同列 不同斜線。思路 1.因為皇后不能同行,所以,在每一行放置乙個皇后就行 2.當在一行放置皇后的時候 1 順序檢查這一行每乙個位置是否和上面所有的皇后,只要有乙個同列或者在斜線上就不能放置 若找到乙個滿足的,放...

回溯法 N皇后問題

n 皇后問題研究的是如何將n 個皇后放置在 n n 的棋盤上,並且使皇后彼此之間不能相互攻擊。不能相互攻擊就是n個皇后兩兩不能同行同列同對角線。示例 輸入 4 輸出 q 解法 1 q q q.q.解法 2 q q q 解釋 4 皇后問題存在兩個不同的解法。可以利用 回溯法子集樹 模板進行求解,每個節...

回溯法 N皇后問題

一般是八皇后,首先是演算法思想如下 void generate int n else 回溯,取消占領.主函式如下 首先從0開始,也就是第一行開始逐級向下 int main else flag col true 回溯考慮上一層的情況,並且把這一層改過來的false改為true d1 n col 7 t...