N皇后
- 题解1 经典回溯 O(N! * N)
按照国际象棋的规则,皇后可以攻击与之处在 同一行或同一列或同一斜线上的棋子。
n
皇后问题 研究的是如何将 n
个皇后放置在 n×n
的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n
,返回所有不同的 n
皇后问题 的解决方案。
每一种解法包含一个不同的 n
皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
题解1 经典回溯 O(N! * N)
class Solution {
vector<string> board;
vector<vector<string>> res;
public:
bool isValid(int n, int row, int col){
// 同一列
for(int i = 0; i <= row; i++){
if(board[i][col] == 'Q')
return false;
}
// 同斜线
// 右上斜
for(int i = row-1, j = col+1; i >= 0 && j < n; i--, j++){
if(board[i][j] == 'Q')
return false;
}
// 左上斜
for(int i = row-1, j = col-1; i >= 0 && j >= 0; i--, j--){
if(board[i][j] == 'Q')
return false;
}
return true;
}
void backtrace(int n, int row){
if(row == n){
res.push_back(board);
return;
}
for(int i = 0; i < n; i++){
if(isValid(n, row, i)){
board[row][i] = 'Q';
backtrace(n, row+1);
board[row][i] = '.';
}
}
}
vector<vector<string>> solveNQueens(int n) {
board.resize(n, string(n, '.'));
backtrace(n, 0);
return res;
}
};