問題描述:在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...