N皇后問題 12 回溯法 簡單

2021-10-05 22:06:18 字數 1562 閱讀 5268

回溯法,主要應用在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 順序檢查這一行每乙個位置是否和上面所有的皇后,只要有乙個同列或者在斜線上就不能放置 若找到乙個滿足的,放...