棋子

导航

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 };

 

posted on 2015-12-27 23:38  鼬与轮回  阅读(261)  评论(0编辑  收藏  举报