要求: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();
}
};
该博客探讨了一个经典的计算机科学问题——N皇后问题。通过实现一个深度优先搜索(DFS)算法,作者展示了如何在N×N的棋盘上放置N个皇后,使得没有任何两个皇后在同一行、同一列或对角线上。代码中包含了有效的列检查和对角线检查策略,以确保放置的合法性。此解决方案有助于理解回溯和搜索算法的应用。
424

被折叠的 条评论
为什么被折叠?



