n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。
示例 1:
输入:n = 4
输出:2
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1
输出:1
提示:
1 <= n <= 9
皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
class Solution {
public:
void dfs(int &res,int row,vector<string> &chessboard){
if(row == chessboard.size()){
res++;
return ;
}
//选列
for(int i = 0;i<chessboard[0].size();i++){
if(!isvalid(row,i,chessboard)) continue;
chessboard[row][i] = 'Q';
dfs(res,row+1,chessboard);
chessboard[row][i] ='.';
}
}
bool isvalid(int row, int col, vector<string> chessboard ){
int n = chessboard.size();
//判断列
for(int i = 0;i<n;i++){
if(chessboard[i][col]=='Q')
return false;
}
//判断左上
for(int i = row,j = col; i>=0&&j>=0; i--,j--){
if(chessboard[i][j]=='Q')
return false;
}
//判断右上
for(int i = row,j = col; i>=0&&j<=n;i--,j++){
if(chessboard[i][j]=='Q')
return false;
}
return true;
}
int totalNQueens(int n) {
int res = 0;
vector<string> temp(n,string(n, '.'));
dfs(res,0,temp);
return res;
}
};