n皇后問題 經典回溯

2021-09-29 03:21:23 字數 1860 閱讀 9060

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個皇后 也代表每個皇后的行序號,因為不同的皇后肯定不在同一行 ...