zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    HDU 1465 不容易系列之一(错排,递归)
    HDU 1397 Goldbach's Conjecture(二分,查找素数)
    HDU 1393 Weird Clock (英语,纪念题)
    HDU 1163 Eddy's digital Roots(模)
    HDU 1098 Ignatius's puzzle(数学归纳)
    HDU 1028 Ignatius and the Princess III (递归,dp)
    字符串方法
    __name__和__main的含义
    list 和 str
    python_元组
  • 原文地址:https://www.cnblogs.com/fresh-coder/p/14364139.html
Copyright © 2011-2022 走看看