【算法/回溯算法/棋盘问题】题解+详细备注(共2题)
class Solution {
public:
vector<vector<string>> result;
bool isValid(int row,int col,vector<string> &chessboard,int n){
for(int i = 0;i<row;++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,int row,vector<string> &chessboard){
if(n == row){
result.push_back(chessboard);
return;
}
for(int i{};i<n;++i){
if(isValid(row,i,chessboard,n)){
chessboard[row][i] = 'Q';
backtracking(n,row+1,chessboard);
chessboard[row][i] = '.';
}
}
}
vector<vector<string>> solveNQueens(int n) {
vector<string> chessboard(n,string(n,'.'));
backtracking(n,0,chessboard);
return result;
}
};
class Solution {
public:
bool isValid(int row,int col,char val,vector<vector<char>>& board){
for(int i{};i<9;++i){
if(board[row][i] == val) return false;
}
for(int i{};i<9;++i){
if(board[i][col] == val) return false;
}
int startRow = (row/3)*3;
int startCol = (col/3)*3;
for(int i{startRow};i<startRow+3;++i){
for(int j = startCol;j < startCol+3;++j){
if(board[i][j] == val) return false;
}
}
return true;
}
bool backtracking(vector<vector<char>>& board){
for(int i{};i<9;++i){
for(int j{};j<9;++j){
if(board[i][j] != '.') continue;
for(char c{'1'} ; c<= '9';++c){
if(isValid(i,j,c,board)){
board[i][j] = c;
if(backtracking(board)) return true;
board[i][j] = '.';
}
}
return false;
}
}
return true;
}
void solveSudoku(vector<vector<char>>& board) {
backtracking(board);
}
};