• Sudoku Solver Backtracking


    该博客好好分析

    Write a program to solve a Sudoku puzzle by filling the empty cells.

    Empty cells are indicated by the character '.'.

    You may assume that there will be only one unique solution.

    回溯法的思想!!(剪枝+回溯+递归运用)

    分析:

    首先遍历整个九宫格,并进行标记!

    rowValid[row][val]等于1表示:row行val已经存在(定义域,row从0~8,val从1~9)

    colValid[col][val]等于1表示:col列val已经存在

    subGrid[row/3*3+col/3][val]等于1表示:第w/3*3+col/3个子九宫格中val已经存在

    利用index来进行算法搜索控制!数独一共有81个数字,0~80;因此当index>80时,算法有解并结束。

     1 class Solution {
     2 public:
     3     void solveSudoku(vector<vector<char>>& board)
     4     {
     5         for(int i=0;i<9;i++)
     6         for(int j=0;j<9;j++)
     7         {
     8             if(board[i][j]!='.')
     9                 handle(i,j,board[i][j]-'0');
    10         }
    11         solve(board,0);
    12     }
    13     
    14     bool solve(vector<vector<char>>& board,int index)
    15     {
    16         if(index>80)
    17             return true;
    18         int row=index/9;
    19         int col=index-index/9*9;
    20         if(board[row][col]!='.')
    21             return solve(board,index+1);
    22         for(int num='1';num<='9';num++)//int num='1';num<'10';num++,这一句的问题所在,'10'是字符串呢还是字符呢?  //每个为填充的格子有9种可能的填充数字
    23         {
    24             if(isValid(row,col,num-'0'))
    25             {
    26                 board[row][col]=num;
    27                 handle(row,col,num-'0');
    28                 if(solve(board,index+1)) return true;
    29                 reset(row,col,num-'0');
    30             }
    31         }
    32         board[row][col]='.';
    33         return false;
    34     }
    35     bool isValid(int row,int col,int val)
    36     {
    37         if(rowValid[row][val]==0 && colValid[col][val]==0 && subGrid[row/3*3+col/3][val]==0)
    38             return true;
    39         return false;
    40     }
    41     void handle(int row,int col,int val)
    42     {
    43         rowValid[row][val]=1;
    44         colValid[col][val]=1;
    45         subGrid[row/3*3+col/3][val]=1;
    46     }
    47     void reset(int row,int col,int val)
    48     {
    49         rowValid[row][val]=0;
    50         colValid[col][val]=0;
    51         subGrid[row/3*3+col/3][val]=0;
    52     }
    53     
    54 private:
    55     int rowValid[9][10];
    56     int colValid[9][10];
    57     int subGrid[9][10];
    58 };
    手里拿着一把锤子,看什么都像钉子,编程界的锤子应该就是算法了吧!
  • 相关阅读:
    原生js实现基本选择器
    javascript数组
    web中关于隐藏与显示
    CSS3 box-shadow(阴影使用)
    java中文件的I/O操作
    组件RecyclerView的应用(一)
    Android客户端与Eclipse服务器端的Socket通信
    C语言关于利用sscanf实现字符串相加减
    TabLayout和ViewPager简单实现页卡的滑动
    DrawerLayout的openDrawer()和closeDrawer()方法
  • 原文地址:https://www.cnblogs.com/chess/p/5081222.html
Copyright © 2020-2023  润新知