Sudoku Solver
class Solution {
private:
map<pair<int, int>, queue<int>> possible;
public:
void solveSudoku(vector<vector<char>> &board) {
vector<pair<int, int>> empty;
unsigned i, j;
for (i = 0; i < 9; i++) {
for (j = 0; j < 9; j++) {
if (board[i][j] == '.') empty.push_back({i, j});
}
}
for (auto it = empty.begin(); it != empty.end();) {
if (possible.find(*it) == possible.end()) {
makeQueue(board, *it);
}
if (possible[*it].empty()) {
possible.erase(*it);
board[(*it).first][(*it).second] = '.';
it--;
continue;
}
board[(*it).first][(*it).second] = possible[*it].front()+'0';
possible[*it].pop();
it++;
}
}
void printBoard(vector<vector<char>>& board){
for (unsigned i = 0; i < 9; i++) {
for (unsigned j = 0; j < 9; j++) {
cout << board[i][j] << " ";
}
cout << "\n";
}
cout << "================\n";
}
void makeQueue(vector<vector<char>> &board, pair<int, int> location) {
unsigned i,j;
int x = location.second;
int y = location.first;
vector<bool> available(10, true);
for (i = 0; i < 9; i++) {
if(board[y][i] != '.') available[board[y][i] - '0'] = false;
if(board[i][x] != '.') available[board[i][x] - '0'] = false;
}
int block_x = x/3*3;
int block_y = y/3*3;
for (i = block_y; i < block_y + 3; i++) {
for (j = block_x; j < block_x + 3; j++) {
if(board[i][j] != '.') available[board[i][j] - '0'] = false;
}
}
for (i = 1; i <= 9; i++) {
if(available[i]) possible[location].push(i);
}
}
};