不能同行、同列、或者45°角
逐行遍历
class Solution {
vector<vector<string>> result;
private:
// 判断放在row,col位置的Q是否合法
bool isValid(int n, vector<string>& chessboard, int row, int col){
for(int i=0; i<n; i++){
if(chessboard[i][col] == 'Q'){ // 检查列
return false;
}
}
for(int i=row-1, j=col-1; i>=0 && j>=0; i--, j--){
if(chessboard[i][j] == 'Q'){ // 检查左上角
return false;
}
}
for(int i=row-1, j=col+1; i>=0 && j<n; i--, j++){
if(chessboard[i][j] == 'Q'){ // 检查右上角
return false;
}
}
return true;
}
void backtracking(int n, vector<string>& chessboard, int row){
if(row == n){ // 当row == n时就到了最下面一行之后了
result.push_back(chessboard);
return;
}
for(int i=0; i<n; i++){ // i相当于遍历列,row来遍历行
if(isValid(n, chessboard, row, i)){ // 如果可以放在这个位置就进行操作
chessboard[row][i] = 'Q';
backtracking(n, chessboard, row+1);
chessboard[row][i] = '.';
}
}
}
public:
vector<vector<string>> solveNQueens(int n) {
result.clear();
vector<string> chessboard(n, string(n, '.')); // 全用'.'来初始化
backtracking(n, chessboard, 0);
return result;
}
};