Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character '.'.
You may assume that there will be only one unique solution.
Solution: back-tracking..
1 class Solution { 2 public: 3 typedef vector<vector<char> > BOARDTYPE; 4 5 void solveSudoku(BOARDTYPE &board) { 6 solveSudokuRe(board, 0, 0); 7 } 8 9 bool solveSudokuRe(BOARDTYPE &board, int row, int col) { 10 getNextEmpty(board, row, col); // get next empty position [row, col] 11 if(row == 9) return true; 12 vector<bool> avail(9, true); 13 getAvailable(board, avail, row, col); // available value in row/row/box 14 for(int i = 0; i < 9; ++i) { 15 if (!avail[i]) continue; 16 board[row][col] = i + '1'; 17 if (solveSudokuRe(board, row, col)) return true; 18 } 19 board[row][col] = '.'; 20 return false; 21 } 22 23 void getNextEmpty(BOARDTYPE &board, int &row, int &col) { 24 do { 25 if (board[row][col] == '.') return; 26 row = (col == 8) ? row + 1 : row; 27 col = (col + 1) % 9; 28 } while (row < 9); 29 } 30 31 void getAvailable(BOARDTYPE &board, vector<bool> &avail, int row, int col) { 32 for (int i = 0; i < 9; ++i) { 33 if (board[row][i] != '.') avail[board[row][i]-'1'] = false; 34 if (board[i][col] != '.') avail[board[i][col]-'1'] = false; 35 int box_i = row/3*3 + i/3, box_j = col/3*3 + i%3; 36 if (board[box_i][box_j] != '.') avail[board[box_i][box_j]-'1'] = false; 37 } 38 } 39 };