【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;
};

浙公网安备 33010602011771号