36/37. Sudoku Solver 数独问题

来源:互联网 发布:科技产品销售网络 编辑:程序博客网 时间:2024/05/16 01:16

36 Valid Sudoku
这里写图片描述

class Solution {public:    bool isValidSudoku(vector<vector<char>>& board) {        bool used[9];        for (int i = 0; i < 9; ++i) {            fill(used, used + 9, false);            for (int j = 0; j < 9; ++j) {                if (!check(board[i][j], used))                    return false;            }            fill(used, used + 9, false);            for (int j = 0; j < 9; ++j) {                if (!check(board[j][i], used))                    return false;            }        }        for (int r = 0; r < 3; ++r) {            for (int c = 0; c < 3; ++c) {                fill(used, used + 9, false);                for (int i = r * 3; i < r * 3 + 3; ++i) {        // i,j确定小块九宫格的坐标                    for (int j = c * 3; j < c * 3 +3; ++j) {                        if (!check(board[i][j], used))                            return false;                    }                }            }        }        return true;    }    bool check(char ch, bool *used) {                 // 采用一维数组代替二维数组,优化算法空间        if (ch == '.') return true;        if (used[ch - '1']) return false;        return used[ch - '1'] = true;    }};

37 Sudoku Solver
这里写图片描述

class Solution {public:    void solveSudoku(vector<vector<char>>& board) {        if(board.empty() || board.size() != 9 || board[0].size() != 9)            return;        dfs(board, 0, 0);    }    bool dfs(vector<vector<char>>& board, int i, int j) {    // 深度优先遍历        if(i == 9) return true;         if(j == 9) return dfs(board, i+1, 0);                // 先写判断函数        if(board[i][j] == '.') {            for(int num = 1; num <= 9; ++num) {                board[i][j] = (char)('0' + num);                if(isValid(board, i, j))                    if(dfs(board, i, j+1))                        return true;                  board[i][j] = '.';                   // 匹配失败后记得还原到原状态            }        } else {            return dfs(board, i, j+1);        }        return false;    }    bool isValid(vector<vector<char>>& board, int i, int j) {          // 检验函数        int row, col;        for(col = 0; col < 9; ++col)            if(col != j && board[i][col] == board[i][j])                return false;        for(row = 0; row < 9; ++row)            if(row != i && board[row][j] == board[i][j])                return false;        for(row = i/3 *3; row < i/3 * 3 + 3; ++row) {            for(col = j/3 * 3; col < j/3 * 3 + 3; ++col) {                if((row != i || col != j) && board[row][col] == board[i][j])                    return false;            }        }        return true;    }};

PS:记住这个dfs模板。