中级农民
- 积分
- 108
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2013-5-15
- 最后登录
- 1970-1-1
|
0037. Sudoku Solver
- class Solution {
- private:
- vector<vector<bool>> bufRows = vector<vector<bool>>(9, vector<bool>(256, false));
- vector<vector<bool>> bufCols = vector<vector<bool>>(9, vector<bool>(256, false));
- vector<vector<bool>> bufDias = vector<vector<bool>>(9, vector<bool>(256, false));
- public:
- bool isValid(vector<vector<char>>& board, int i, int j, char c) {
- return !bufRows[i][c]
- && !bufCols[j][c]
- && !bufDias[i/3*3 + j/3][c];
- }
- void setFlag(vector<vector<char>>& board, int i, int j, char c, bool value) {
- bufRows[i][c] = value;
- bufCols[j][c] = value;
- bufDias[i/3*3 + j/3][c] = value;
- }
- bool solve(vector<vector<char>>& board, int i, int j) {
- if (i == 9) return true;
- if (j == 9) return solve(board, i+1, 0);
-
- char c = board[i][j];
- if (c != '.') return solve(board, i, j+1);
-
- for (char d = '1'; d <= '9'; d++) {
- if (!isValid(board,i, j, d))
- continue;
- setFlag(board, i, j, d, true);
- board[i][j] = d;
- if (solve(board, i, j+1))
- return true;
- board[i][j] = '.';
- setFlag(board, i, j, d, false);
- }
- return false;
- }
- void solveSudoku(vector<vector<char>>& board) {
- for (int i = 0; i < 9; i++) {
- for (int j = 0; j < 9; j++) {
- char c = board[i][j];
- if (c == '.')
- continue;
- bufRows[i][c] = true;
- bufCols[j][c] = true;
- bufDias[i/3*3 + j/3][c] = true;
- }
- }
- solve(board, 0, 0);
- }
- };
- ```
- ```c++
- class Solution {
- public:
- bool validatePos(const vector<vector<char>>& board, int i, int j) {
- // vertical
- vector<bool> vcols(9, false);
- for (int m = 0; m < 9; m++) {
- // cols
- if (board[m][j] == '.') continue;
-
- int num = board[m][j] - '1';
- if (vcols[num]) {
- return false;
- }
- vcols[num] = true;
- }
- // 3x3
- vector<bool> vsqrs(9, false);
- int basei = i/3*3;
- int basej = j/3*3;
- for (int m = 0; m < 9; m++) {
- char c = board[basei+m/3][basej+m%3];
- if (c == '.') continue;
- int num = c - '1';
- if (vsqrs[num]) return false;
- vsqrs[num] = true;
- }
- return true;
- }
- bool tryNext(vector<vector<char>>& board, vector<vector<bool>>& cache) {
- bool started = false;
- for (int i = 0; i < 9; i++) {
- for (int j = 0; j < 9; j++) {
- char c = board[i][j];
- if (c != '.') continue;
-
- // try every possible values
- for (int m = 0; m < 9; m++) {
- if (!cache[i][m]) continue;
- board[i][j] = m + '1';
- cache[i][m] = false;
- if (validatePos(board, i, j)
- && tryNext(board, cache)) {
- return true;
- }
- board[i][j] = '.';
- cache[i][m] = true;
- }
- // tried every possible ways still no luck, must have made a wrong attempt
- return false;
- }
- }
- // nothing left to guess
- return true;
- }
- void solveSudoku(vector<vector<char>>& board) {
- // pre-calc per row
- vector<vector<bool>> cache(9, vector<bool>(9, true));
- for (int i = 0; i < 9; i++) {
- for (int j = 0; j < 9; j++) {
- char c = board[i][j];
- if (c != '.') {
- cache[i][c - '1'] = false;
- }
- }
- }
- tryNext(board, cache);
- }
- };
复制代码 |
|