LeetCode37. 解数独

题目

分析

本题区别于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 };

 

posted @ 2021-02-02 20:47  Uitachi  阅读(54)  评论(0编辑  收藏  举报