Leetcode 37 递归回溯。

这就是一个经典的回溯递归问题,一个格子一个格子的填写,递归到下一层

递归回溯的方法是每一格子1-9逐个填写,因为数读只有唯一解,因此这种搜索的方法一定可以找到答案。

 

class Solution {
public:
    bool flagRow[9][9];              // 第一个下标个代表行号,第二个下标代表该数字是否用过
    bool flagCol[9][9];              // 第一个下标代表列号,  第二个下标代表该数字是否用过
    bool flagBox[3][3][9];

    void solveSudoku(vector<vector<char>>& board) {
        memset(flagRow,false,sizeof flagRow);
        memset(flagCol,false,sizeof flagCol);
        memset(flagBox,false,sizeof flagBox);
        for(int i=0;i<9;i++){
            for(int j=0;j<9;j++){
                if(board[i][j]!='.'){
                    int k = board[i][j] - '1';
                    flagRow[i][k] = true;
                    flagCol[j][k] = true;
                    flagBox[i/3][j/3][k] = true;
                }
            }
        }
        dfs(board,0,0);
    }

    bool dfs(vector<vector<char>>& board, int x, int y){
        cout<<x<<" "<<y<<endl;
        if(x==9){
            y++;
            x=0;
        }
        if(y==9) return true;
        if(board[y][x]!='.') return dfs(board,x+1,y);
        for(int i=0;i<9;i++){
            if(!flagRow[y][i]&&!flagCol[x][i]&&!flagBox[y/3][x/3][i]){
                board[y][x] = '1'+ i;
                flagRow[y][i] = true;
                flagCol[x][i] = true;
                flagBox[y/3][x/3][i] = true;
                if(dfs(board,x+1,y)) return true;
                board[y][x] = '.';
                flagRow[y][i] = false;
                flagCol[x][i] = false;
                flagBox[y/3][x/3][i] = false;
            }
        }
        return false;
    }
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值