要求:rt
思路:v可以换ans
class Solution {
public:
vector<vector<string>> v;
bool isValid(int row, int col, vector<string>& chessboard, int n) {
int count = 0;
// 检查列
for (int i = 0; i < row; i++) { // 这是一个剪枝
if (chessboard[i][col] == 'Q') {
return false;
}
}
// 检查 45度角是否有皇后
for (int i = row - 1, j = col - 1; i >=0 && j >= 0; i--, j--) {
if (chessboard[i][j] == 'Q') {
return false;
}
}
// 检查 135度角是否有皇后
for(int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
if (chessboard[i][j] == 'Q') {
return false;
}
}
return true;
}
void dfs(int n,vector<string> &board,int start){
if(n==start){
v.push_back(board);
return;
}
//for(int i=start;i<n;++i){//按行优先不能对行循环
int i=start;
for(int j=0;j<n;++j){
if(isValid(i,j,board,n)){
board[i][j]='Q';
dfs(n,board,i+1);
board[i][j]='.';
}
}
}
int totalNQueens(int n) {
string row = string(n, '.');
vector<string> board(n,row);
dfs(n,board,0);
return v.size();
}
};