题目
分析
本题区别于n皇后问题,n皇后问题是每一行放置一个,而解数独问题,是每行可放置多个数。实质就是二维递归,既对行进行递归,也对列进行递归。只要搜索到一种可以满足题意的结果立即返回,所以backtracking的类型是bool,意味可能不必搜索整个树。并且不需要判断结束条件,不会导致进入死循环。因为只要将整个表遍历结束,其中没有返回false,就找到了。
代码
1 class Solution { 2 private: 3 bool backtracking(vector<vector<char>> &board){ 4 for(int i = 0;i < board.size();i++){//遍历行 5 for(int j = 0;j < board[0].size();j++){ //遍历列 6 if(board[i][j] != '.') continue; 7 for(char k = '1';k <= '9';k++){ 8 if(isValid(i,j,k,board)){ //检验(i,j)这个位置放K是否合适 9 board[i][j] = k; 10 if(backtracking(board)) return true; //找到合适的一组立马返回 11 board[i][j] = '.'; //回溯 12 } 13 } 14 return false; //1-9都不合适 15 } 16 } 17 return true; //全部遍历结束,没有返回false说明成功 18 } 19 bool isValid(int row,int col,char val,vector<vector<char>>board){ 20 //检查行 21 for(int j = 0;j < 9;j++){ 22 if(board[row][j] == val) return false; 23 } 24 //检查列 25 for(int i = 0;i < 9;i++){ 26 if(board[i][col] == val) return false; 27 } 28 //检查3x3 29 int srow = (row / 3) * 3; 30 int scol = (col / 3) * 3; 31 for(int i = srow;i < srow + 3;i++){ 32 for(int j = scol;j < scol + 3;j++){ 33 if(board[i][j] == val) return false; 34 } 35 } 36 return true; 37 } 38 public: 39 void solveSudoku(vector<vector<char>>& board) { 40 backtracking(board); 41 } 42 };