37. Sudoku Solver

来源:互联网 发布:mac用什么炒股软件 编辑:程序博客网 时间:2024/05/17 09:12

这道题让填数独。

我能想到最坏的方法是,回溯,遍历所有的空白格子,填上一个数字,然后遍历他所在的这一行,这一列,这一宫,看是否可以。所以需要一个单独的isValid函数。

class Solution {public:    void solveSudoku(vector<vector<char>>& board) {        if(board.empty() || board[0].empty())   return;        helper(board, 0, 0);    }    bool helper(vector<vector<char>>& board, int i, int j){        if(i >= 9)   return true;        if(j >= 9)  return helper(board, i+1, 0);        if(board[i][j] == '.'){            for(int k = 1; k <= 9; ++k){                board[i][j] = '0' + k;                if(isValid(board, i, j) == true){                    if(helper(board, i, j+1) == true)                        return true;                }                board[i][j] = '.';            }        }        else{            return helper(board, i, j+1);        }        return false;      }    bool isValid(vector<vector<char>>& board, int i, int j){        for(int k = 0; k < 9; ++k){            if(k != i && board[k][j] == board[i][j])                return false;        }        for(int k = 0; k < 9; ++k){            if(k != j && board[i][k] == board[i][j])                return false;        }        for(int ki = 3 * (i/3); ki < 3*(i/3) + 3; ++ki){            for(int kj = 3 * (j/3); kj < 3*(j/3) + 3; ++kj){                if((i != ki || j != kj) && board[ki][kj] == board[i][j])                    return false;            }        }        return true;            }};


原创粉丝点击