原题链接在此:https://leetcode.com/problems/sudoku-solver/
这道题是递归回溯.
Note: 1. 设值新的helper recursive function 要带有返回boolean 值,因为要判断此递归方案正确与否。
2. 检查本轮时候正确后还需检查下一轮,这里还是有点不明白。
3. 注意什么时候返回。先要枚举所有本轮的解,对于每一个符合本轮条件的解进行递归处理子问题,如果子问题能返回ture,说明本轮的解正确;若子问题返回false,说明本轮的解不能最终求出全部答案,则应该改回原值,进行下一轮尝试。如果尝试了所有可能解,都不能用,则本轮向上一轮返回false,让上一轮改值。所以,不但要检查本轮解,也需要检查下一轮解,同时满足才是正确的。(DFS)
AC Java:
public class Solution {
public void solveSudoku(char[][] board) {
if(board == null || board.length!=9 | board[0].length!=9)
return;
helper(board,0,0);
}
private boolean helper(char[][] board, int i, int j){
if(j == board[0].length){
return helper(board,i+1,0);
}
if(i == board.length){
return true;
}
if(board[i][j] == '.'){//There is an empty spot
for(int k = 1;k<=9;k++){
board[i][j] = (char)(k+'0');//Doing Casting, remember to add parentheses to char.
if(isValid(board,i,j)){//Check if currrent round is Valid
if(helper(board,i,j+1)) //Check if there is a solution
return true;
}
board[i][j] = '.';
}
}else{
return helper(board,i,j+1);
}
return false;
}
private boolean isValid(char[][] board, int i, int j){
for(int k = 0;k<board[0].length;k++){
if((k!=j) && (board[i][j] == board[i][k])){
return false;
}
}
for(int k = 0;k<board.length;k++){
if((k!=i) && (board[i][j] == board[k][j])){
return false;
}
}
for(int row = i/3*3;row < i/3*3+3; row++){
for(int col = j/3*3;col<j/3*3+3;col++){
if((i!=row || j!=col) && (board[row][col] == board[i][j])){
return false;
}
}
}
return true;
}
}