n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,並且使皇后彼此之間不能相互攻擊。
上圖為 8 皇后問題的一種解法。
給定乙個整數 n,返回所有不同的 n 皇后問題的解決方案。
每一種解法包含乙個明確的 n 皇后問題的棋子放置方案,該方案中 'q' 和 '.' 分別代表了皇后和空位。
示例:
輸入: 4
輸出: [
[".q..", // 解法 1
"...q",
"q...",
"..q."],
["..q.", // 解法 2
"q...",
"...q",
".q.."]
]解釋: 4 皇后問題存在兩個不同的解法。
n皇后問題是經典的回溯演算法問題。由於一行只能有乙個皇后,所以不需要按位置迭代,只需要按行迭代即可。在每行找到合適的位置放置,然後放下一行;如果當前行找不到合適的位置,則回溯到上一行。合適的位置是指當前行、當前列以及當前皇后所在的兩條對角線都沒有皇后。
為了判斷位置(row, col)是否是乙個可以放置皇后的位置,我們使用乙個長度為n的陣列visit[n],初始化陣列元素為0,並設定visit[row]=col。例如,假設已經在(0,1)、(1,3)分別放置了兩個皇后,則visit[0]=1, visit[1]=3。如果位置(row, col)滿足下面3個條件中的乙個,則說明(row, col)不能放置皇后:
之所以沒有判斷當前行是否有皇后是因為我們每次都選擇乙個新行來放置皇后,所以不用判斷。如果不滿足這3個條件,則當前位置(row, col)可以放置皇后。**如下:
class solution };
vector> board(n, vector(n, 0));
vectorvisit(n, 0);
int row = 0, col = 0;
dfs(row, col, board, visit, n);
return ans;
}void dfs(int row, int col, vector> board, vectorvisit, int n)
for(int i=0; ivisit)};
vector> board(n, vector(n, 0));
int row = 0, col = 0;
dfs(row, col, board, n);
return ans;
}void dfs(int row, int col, vector> board, int n)
for(int i=0; i> board)
}for (int i = row, j = col; i >= 0 && j >= 0; i--, j--)
}for (int i = row, j = col; i >= 0 && j < board.size(); i--, j++)
}return true;
}vectortransform(vector> board){
vectorv;
for(int i=0; i這種方法沒有使用visit陣列的方法好記。
Leetcode 51 N皇后 回溯
題目 51 題意 求解n皇后問題的所有解 思路 回溯,對於每一行必須且只能放置乙個皇后,於是只需要考慮列即可。對於每一行,按列進行迴圈,檢查當前位置是否可以放置皇后,如果可以就把攻擊範圍的方格打上標記。如果row current row,意味著得到了乙個可能的方案,回溯尋找下乙個可能的方案,直到所有...
n皇后(回溯)
題目描述 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。輸入測試資料由多組測試樣例組成。每組測試資料第一行輸入乙個正整數 n 1 n 10 輸出輸出有多少種合...
leetcode 52 N皇后II(回溯)
n 皇后問題研究的是如何將 n 個皇后放置在 n n 的棋盤上,並且使皇后彼此之間不能相互攻擊。上圖為 8 皇后問題的一種解法。給定乙個整數 n,返回 n 皇后不同的解決方案的數量。示例 輸入 4 輸出 2 解釋 4 皇后問題存在如下兩個不同的解法。q.解法 1 q q.q.q.解法 2 q.q q...