51. N 皇后
- 按照行搜索
- 使用visited数组来记录列的搜索情况
class Solution {
public:
vector<vector<string>>result;
vector<bool>visited;
bool check(vector<string>& map, int row, int col){
if(visited[col]) return false;
for(int i=row, j =col; i>=0 && j>=0; i--,j--){
if(map[i][j] == 'Q') return false;
}
for(int i=row, j =col; i>=0 && j<map.size(); i--,j++){
if(map[i][j] == 'Q') return false;
}
return true;
}
void dfs(int n, int row, vector<string>& map){
if(row>=n){
result.push_back(map);
return;
}
for(int col=0; col<n; col++){
if(check(map, row, col)){
map[row][col] = 'Q';
visited[col] = true;
dfs(n, row+1, map);
visited[col] = false;
map[row][col] = '.';
}
}
}
vector<vector<string>> solveNQueens(int n) {
vector<string>map(n, string(n, '.'));
visited = vector<bool>(n, false);
dfs(n, 0, map);
return result;
}
};
37. 解数独
- 一个一个数填 一个for循环遍历棋盘的行,一个for循环遍历棋盘的列,一行一列确定下来之后,递归遍历这个位置放9个数字的可能性!
- 找到一个合适的立即返回 也就是 return
class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
backtracking(board);
}
bool backtracking(vector<vector<char>>& board) {
for(int i=0; i<board.size(); i++){
for(int j=0; j<board.size(); j++){
if(board[i][j] == '.'){
for(char k ='1'; k<='9'; k++){
if(judge(i, j, k, board)){
board[i][j] = k;
if(backtracking(board)) return true;
board[i][j] = '.';
}
}
return false;
}
}
}
return true;
}
bool judge(int x, int y, char k, vector<vector<char>>&board){
for(int i=0; i<board.size(); i++){
if(board[x][i] == k || board[i][y] == k)return false;
}
int startRow = (x / 3) * 3;
int startCol = (y / 3) * 3;
for (int i = startRow; i < startRow + 3; i++) {
for (int j = startCol; j < startCol + 3; j++) {
if (board[i][j] == k ) {
return false;
}
}
}
return true;
}
};
332. 重新安排行程