N皇后問題

2021-07-22 23:50:59 字數 953 閱讀 7391

n-queens

問題描述:

在學習回溯的時候,八皇后問題是一道非常有名的問題,八皇后的問題的描述是:在乙個8*8的棋盤上放置8個皇后,每行乙個並使其不能互相攻擊(同一行、同一列、同一斜線上的皇后都會自動攻擊)。

當將問題擴充套件之後就變成了n皇后的問題。

題目給你乙個數字n,讓你返回滿足條件的棋盤格局。

這道題主要是要想好回溯變數和是否回溯的條件以及結束回溯的條件。題目要求返回棋盤格局,所以我們可以一行一行的來進行回溯,所以回溯變數可以確定為行數。當我們回溯到最後一行的時候,可以確定我們已經得到了乙個答案,所以可以結束回溯,返回。是否回溯的條件,也就是判斷是否需要剪枝,當我們判斷如果在某一行某一列放置皇后會引起攻擊,拿著乙個位置就不能放,剪枝。

如何判斷皇后會引起攻擊呢:

1 在同一行,我們是按行來進行回溯的,不存在這個問題

2 按列,我們可以用乙個陣列儲存已經放置皇后的列,然後每次判斷乙個位置可以判斷該列是否在陣列中

3 按對角線,兩個皇后在對角線上的條件是|rows1-rows2|=|cols1-cols2|,我們是按照行,進行回溯的,那麼每存入乙個列的數字,則表示改行回溯過了,該下標就可以表示是該位置的行數。所以我們可以根據這個進行判斷。

class solution

void findnq(int n,int rows)

for(int cols=0;cols

n-queens ii

問題描述:

其實2比1簡單一點,因為2只需要返回總共有多少種解,我們不需要記錄具體的棋盤擺放方式。所以只需要乙個全域性變數記錄已經放置皇后的列數即可。

不過回溯非常重要!

class solution

void findnq(int n,int rows)

for(int cols=0;cols

N皇后問題

include define maxqueens 20 define minqueens 4 enum bool typedef struct queendata queendata queendata queens maxqueens 1 int ncount init int init chec...

N皇后問題

採用遞迴回溯法 執行結果 輸入8 對於n皇后解的個數,參考 當n 16時,構造法給出解,參考poj 3239 一 當n mod 6 2 且 n mod 6 3時,有乙個解為 2,4,6,8,n,1,3,5,7,n 1 n為偶數 2,4,6,8,n 1,1,3,5,7,n n為奇數 上面序列第i個數為...

N皇后問題

問題 題目 於西洋棋的玩法,因為皇后所在的位置可以縱向 橫向 兩個斜向四個方向的 捕捉 所以8皇后問題就是要求如何布置8個皇后在8 8的棋盤上而使他們互相無法 捕捉 也就是說不存在兩個皇后同行或同列,或在同一斜線上。而n皇后問題就是如何布置n個皇后在n n棋盤裡使不存在兩個皇后在同行同列和同一斜線上...