1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| class Solution { public: void solveSudoku(vector<vector<char>>& board) { for(size_t i = 0; i < 9; ++i) { for(size_t j = 0; j < 9; ++j) { auto& num = board[i][j]; if(num != '.') { col[num - 49][j] += 1; row[i][num - 49] += 1; block[i / 3][j / 3][num - 49] += 1; } } } solve(board, 0, 0); } private: int col[9][9]{0}; int row[9][9]{0}; int block[3][3][9]{0}; bool valid(size_t i, size_t j, int target) { if(col[target][j] || row[i][target] || block[i / 3 ][j /3][target]) return false; else return true; } bool solve(vector<vector<char>>& board, int i, int j) { if(i == 9) return true; if(j == 9) return solve(board, i + 1, 0); if(board[i][j] != '.') return solve(board, i, j + 1); for(char c = '1'; c <= '9'; ++c) { auto& num = board[i][j]; if(valid(i, j, c - 49)) { num = c; col[num - 49][j] = row[i][num - 49] = block[i / 3 ][j /3][num - 49] = 1; if(solve(board, i, j + 1)) return true; col[num - 49][j] = row[i][num - 49] = block[i / 3 ][j /3][num - 49] = 0; num = '.'; } } return false; } };
|