day 搜索 332没做出

文章讲述了如何运用回溯法来解决51.N皇后问题和37.解数独问题。在N皇后问题中,通过visited数组记录列的搜索状态,检查当前位置是否可以放置皇后并进行深度优先搜索;在解数独中,通过逐行逐列遍历并尝试填充数字,利用递归判断当前位置数字的合法性并回溯。
摘要由CSDN通过智能技术生成

51. N 皇后

  1. 按照行搜索
  2. 使用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. 解数独

  1. 一个一个数填 一个for循环遍历棋盘的行,一个for循环遍历棋盘的列,一行一列确定下来之后,递归遍历这个位置放9个数字的可能性!
  2. 找到一个合适的立即返回 也就是 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++) { // 判断9方格里是否重复
            for (int j = startCol; j < startCol + 3; j++) {
                if (board[i][j] == k ) {
                    return false;
                }
            }
        }
        return true;
    }
};

332. 重新安排行程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值