回溯法,主要應用在dfs中,主要思想是當你push乙個元素後,記住要pop回去,大致的模板是
path.
push_back
(nums[i]);
dfs(pos+1)
;path.
pop(
);
詳細的模板在我們之前用回溯法解決全排列問題有提到。
n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,並且使皇后彼此之間不能相互攻擊。 給定乙個整數 n,返回所有不同的 n 皇后問題的解決方案。每一種解法包含乙個明確的 n 皇后問題的棋子放置方案,該方案中 『q』 和 『.』 分別代表了皇后和空位。
思路:標準的dfs模板套路,只是要判斷位置是否合法,自己編寫乙個函式判斷。剛開始全都初始化為』.』,我們dfs時是逐行遞迴,在dfs中判斷在pos那一行中的哪一列進行插入,這裡需要乙個isvalid(row,col)函式進行判斷位置是否合法,判斷時分為四部分,行,列,對角線,反對角線進行判斷是否有』q』。
class
solution
//逐列判斷
for(
int i=
0;i)for
(int k=
1;k<=
min(row,col)
;k++
)for
(int k=
1;k<=
min(row,n-
1-col)
;k++
)return
true;}
void
dfs(
int pos,
int n)
for(
int j=
0;j} vector>
solvenqueens
(int n)
給定乙個整數 n,返回所有不同的 n 皇后問題的解決方案。每一種解法包含乙個明確的 n 皇后問題的棋子放置方案,該方案中 『q』 和 『.』 分別代表了皇后和空位。
n皇后問題1可以理解為問題2的簡化版,不要求輸出結果,只輸出方案數,方法與2類似,其實還有更簡單的方法,進行位運算判斷位置是否合法,但比較難理解。
class
solution
//對這一列進行判斷
for(
int i=
0; i)/*對角線 \ */
for(
int i=
1; i<=
min(row,col)
; i++
)//反對角線 /
for(
int i=
1; i<=
min(row,n-
1-col)
; i++
)return
true;}
void
dfs(
int n,
int pos)
for(
int j=
0;j}int
totalnqueens
(int n)
};
006回溯法 n皇后問題
在n n格的棋盤上放置彼此不受攻擊的n個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於在n n格的棋盤上放置n個皇后,任何2個皇后不放在同一行或同一列或同一斜線上。如下 nqueen by xcz on 2013.9.10 include include...
hdu1116回溯N皇后問題
題目連線 經過思考,不難發現 恰好n個皇后放在不同行不同列,那麼是不是可以轉換成n個皇后所在行分別確定 一人一行 的情況下對她們的所在列的列舉。也就是列的全排列生成問題,我們用c x 表示x行皇后的列編號。而我們知道0 n 1的排列一共有n的階乘,列舉量不會超過它。if cur n 遞迴邊界。只要走...
N 皇后問題 回溯法
n 皇后問題 在 n n 的棋盤上放置彼此不受攻擊的 n 個皇后,任意兩個皇后不同行 不同列 不同斜線。思路 1.因為皇后不能同行,所以,在每一行放置乙個皇后就行 2.當在一行放置皇后的時候 1 順序檢查這一行每乙個位置是否和上面所有的皇后,只要有乙個同列或者在斜線上就不能放置 若找到乙個滿足的,放...