37. 解数独/C++

在这里插入图片描述
回溯法

class Solution {
private:
    vector<vector<bool>> rowCheck;//rowCheck[i][j]表示数字j+1是否在第i行出现(行数从0开始)
    vector<vector<bool>> colCheck;//colCheck[i][j]表示数字j+1是否在第i列出现
    vector<vector<bool>> blockCheck;//blockCheck[i][j]表示数字j+1是否在第i个宫内出现
    
    bool dfs(vector<vector<char>>& board){
        int row=-1,col=-1;
        //先找空格子
        for(int i=0;i<9;++i)
            for(int j=0;j<9;++j)
                if(board[i][j]=='.'){
                    row=i;
                    col=j;
                    goto OK;
                }
        OK:
        //如果没有空格子了,就表示找到了一种解法
        if(row==-1)
            return true;
        else{
        	//从1到9选择一个填到空格子中
            for(int i=1;i<=9;++i){
            	//如果在该行、该列、该宫内已经有了该数,则换下一个数试一下
                if(rowCheck[row][i-1] || colCheck[col][i-1] || blockCheck[3*(row/3)+col/3][i-1])
                    continue;
                else{
                	//找到合适的数,就先试着填进去,并改变相应数组
                    board[row][col]=i+'0';
                    rowCheck[row][i-1]=true;
                    colCheck[col][i-1]=true;
                    blockCheck[3*(row/3)+col/3][i-1]=true;
                    
                    //开始填下一个空格子
                    if(dfs(board))
                        return true;
                    
                    //如果下一个空格子返回值是false,那就回溯,再选新的值再填
                    board[row][col]='.';
                    rowCheck[row][i-1]=false;
                    colCheck[col][i-1]=false;
                    blockCheck[3*(row/3)+col/3][i-1]=false;
                }
            }
            //所有值都选了,没有合适的
            return false;
        }
    }
public:
    void solveSudoku(vector<vector<char>>& board) {
        rowCheck=vector<vector<bool>>(9,vector<bool>(9,false));
        colCheck=vector<vector<bool>>(9,vector<bool>(9,false));
        blockCheck=vector<vector<bool>>(9,vector<bool>(9,false));
        
        for(int i=0;i<9;++i)
            for(int j=0;j<9;++j)
                if(board[i][j]!='.'){
                    rowCheck[i][board[i][j]-'1']=true;
                    colCheck[j][board[i][j]-'1']=true;
                    blockCheck[3*(i/3)+j/3][board[i][j]-'1']=true;
                }
        dfs(board);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值