Original problem: 37 Sudoku Solver 这里写链接内容
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.
Related problem: 36 Valid Sudoku 这里写链接内容
Analysis: This problem is a little bit different from very typical backtracking problems though its process is executed in a very trivial backtracking way: Try each character ‘1’~’9’ in where the sudoku is marked by ‘.’, if one succeed at some step, then go into next step similarly. After all blanks have been filled with digit characters and the sudoku is valid, keep that sudoku and return it as the final result.
The key point here is to control the process, and make it stop when we find a right solution, otherwise the current correct solution would be erased if we do not stop the backtracking process immediately.
So we use a boolean helper here, inside the helper function, we go through all positions, if at some step, we find all digit chars can not make the sudoku success, we return false. After scanning all the blocks in the sudoku grid, we return true which means we did not see any place that digit chars would fail the sudoku. Here is the code for this problem:
public class Solution {
public void solveSudoku(char[][] board) {
helper(board);
}
private boolean helper(char[][] board){
for(int ii = 0; ii < 9; ii++){
for(int jj = 0; jj < 9; jj++){
if(board[ii][jj] == '.'){
for(char c = '1'; c <= '9'; c++){
if(isValid(board, ii, jj, c)){
board[ii][jj] = c;
if( helper(board) ) return true;
else board[ii][jj] = '.';
}
}
return false;
}
}
}
return true;
}
private boolean isValid(char[][] board, int i, int j, char c){
for(int ii = 0; ii < 9; ii++){
if(board[ii][j] == c) return false;
}
for(int jj = 0; jj < 9; jj++){
if(board[i][jj] == c) return false;
}
for(int ii = (i/3)*3; ii < (i/3)*3+3; ii++){
for(int jj = (j/3)*3; jj < (j/3)*3+3; jj++){
if(board[ii][jj] == c) return false;
}
}
return true;
}
}