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