LeetCode-37. 解数独

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l718531794/article/details/85111240

题目地址:https://leetcode-cn.com/problems/sudoku-solver/
思路:预处理每行每列每块能取得数,dfs。
AC代码:

class Solution {
public: 
    bool flag_1[10][10];  
    bool flag_2[10][10];    
    bool flag_3[10][10];
    
    bool solve(vector<vector<char>>& board,int x,int y){
       for(int i=x;i<9;i++){
           for(int j=y;j<9;j++){
                int now = i/3 * 3 + j/3;
                //cout<<now<<endl;
                if(board[i][j] == '.'){
                    //cout<<i<<" "<<j<<endl;
                    for(int k = 1;k <= 9;k++){
                        if(!flag_1[i][k] && !flag_2[j][k] && !flag_3[now][k] ){
                            board[i][j] = k+'0';
                            flag_1[i][k] = flag_2[j][k] = flag_3[now][k] = true;
                            if(solve(board,i,j))
                                return true;
                            flag_1[i][k] = flag_2[j][k] = flag_3[now][k] = false;
                             board[i][j] = '.';
                        }
                    }
                    return false;
                }
            }
           y = 0;
       }
            
        for(int i=0;i<9;i++){
            for(int j=1;j<=9;j++){
                if(!flag_1[i][j] || !flag_2[i][j] || !flag_3[i][j] )
                    return false;
            }
        }
        return true;
    }
    
    void solveSudoku(vector<vector<char>>& board) {
        memset(flag_1,false,sizeof(flag_1));
        memset(flag_2,false,sizeof(flag_2));
        memset(flag_3,false,sizeof(flag_3));
        for(int i=0;i<9;i++)
            for(int j=0;j<9;j++){
                if(board[i][j] == '.')
                    continue;
                flag_1[i][board[i][j]-'0'] = true;
            }
        for(int i=0;i<9;i++)
            for(int j=0;j<9;j++){
                if(board[j][i] == '.')
                    continue;
                flag_2[i][board[j][i]-'0'] = true;
            }
        int xx[10] = {0,0,0,1,1,1,2,2,2};
        int yy[10] = {0,1,2,0,1,2,0,1,2};
        for(int i=0;i<=6;i+=3)
            for(int j=0;j<=6;j+=3){
                int now = (i*3+j)/3;
                for(int k = 0;k<9;k++){
                    if(board[i+xx[k]][j+yy[k]] == '.')
                        continue;
                    flag_3[now][board[i+xx[k]][j+yy[k]]-'0'] = true;
                }
        }
       solve(board,0,0);
        
    }
};

猜你喜欢

转载自blog.csdn.net/l718531794/article/details/85111240