【DFS+回溯】37. 解数独

位运算可以大大降低运算难度!!!

class Solution {
public:
    

    void print(vector<vector<char>>& board){
        for(auto b: board){
            for(auto a: b){
                cout << a << " ";
            }
            cout << endl;
        }
        cout << endl;
    }

    bool dfs(vector<vector<char>>& board, vector<int> &row_num, vector<int> &col_num, vector<int> &block_num, int index){
        if(space_len == index)
            return true;
        int x = space_area[index][0];
        int y = space_area[index][1];
        int bit_num = row_num[x] | col_num[y] | block_num[x / 3 * 3 + y / 3];
        bool flag = false;
        for(int i=1;i<=9;++i){
            if((bit_num >> i) % 2 == 0){
                row_num[x] |= (1 << i);  //关键!!!
                col_num[y] |= (1 << i);  //关键!!!
                block_num[x /3 * 3 + y / 3] |= (1 << i);   //关键!!!
                board[x][y] = i + '0';
                flag = flag || dfs(board, row_num, col_num, block_num, index + 1);
                if(!flag){
                    board[x][y] = '.';
                    row_num[x] ^= (1 << i);  //关键!!!
                    col_num[y] ^= (1 << i);  //关键!!!
                    block_num[x /3 * 3 + y / 3] ^= (1 << i);  //关键!!!
                }
                else
                    break;
            }
        }
        return flag;
    }

    void solveSudoku(vector<vector<char>>& board) {
        vector<int> row_num(9, 0);  //关键!!!
        vector<int> col_num(9, 0);   //关键!!!
        vector<int> block_num(9, 0);   //关键!!!
         
        for(int i=0;i<9;++i)
            for(int j=0;j<9;++j)
                if(board[i][j] == '.')
                    space_area.push_back({i, j});
                else{
                    row_num[i] |= (1 << (board[i][j] - '0'));   //关键!!!
                    col_num[j] |= (1 << (board[i][j] - '0'));   //关键!!!
                    block_num[i /3 * 3 + j / 3] |= (1 << (board[i][j] - '0'));   //关键!!!
                }
        space_len = space_area.size();
        dfs(board, row_num, col_num, block_num, 0);

    }
private:
    int space_len;
    vector<vector<int>> space_area;
};
posted @ 2022-03-01 16:51  fwx  阅读(24)  评论(0)    收藏  举报