n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,
並且使皇后彼此之間不能相互攻擊。
給定乙個整數 n,返回所有不同的 n 皇后問題的解決方案。
每一種解法包含乙個明確的 n 皇后問題的棋子放置方案,該方案中 『q』 和 『.』 分別代表了皇后和空位。
輸入:
4輸出:[[
".q.."
,// 解法 1
"...q"
,"q..."
,"..q."],
["..q."
,// 解法 2
"q..."
,"...q"
,".q.."]]
解釋:4 皇后問題存在兩個不同的解法。
思路:
int test[n]
[n];
stack
int,
int>> queen;
int sum;
//可能的結果數
bool
fun(row,col) 嘗試在第row行, 第col列放
else
for(
int i=
0;i}for
(int i=
0; i
)關於如何判斷queen是否違反條件:
用新加入的點的 之前老的點乙個乙個比較
(i,j)(m, n)
i!=m
j!=n
i-j != m-n 左上到右下
i+j != m+n 左下到右上
;
只要結果總數n時。
使用常規深度優先一層層搜尋
使用三個整形分別標記每一層哪些格仔可以放置皇后,
這三個整形分別代表列、左斜下、右斜下(_col, ld, rd_),
二進位制位為 11 代表不能放置,00 代表可以放置
核心兩個位運算:
x &-x 代表除最後一位 11 保留,其它位全部為 00
x &(x -
1) 代表將最後一位 11 變成 00
class
solution
void
dfs(
int n,
int row,
int col,
int ld,
int rd)
// 將所有能放置 q 的位置由 0 變成 1,以便進行後續的位遍歷
int bits =
~(col | ld | rd)&(
(1<< n)-1
);while
(bits >0)
}private
:int res =0;
};
回溯經典 n皇后問題
題目大意 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n n,而皇后個數也變成n。當且僅當 ...
回溯法 經典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叉樹表示這個問題的求解空間,在回溯遍歷這個課二叉樹的過程中形成合理的解。對於這棵n叉樹,列序號i 0 n 1 是它的孩子,而每個孩子都有深度為n的子樹 包括自身 這些子樹的層次是n個皇后 也代表每個皇后的行序號,因為不同的皇后肯定不在同一行 ...