37. 解数独


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sudoku-solver
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
注意几点:
1, 需要加返回值,我为什么呢?要区分回溯的状态,是已经填充完毕的回溯返回还是下一个值无法填写的回溯。
// 就是[1,9]挨着试,不冲突,下一个格;冲突,试下一个数,都冲突,回溯到上一层。
public void solveSudoku(char[][] board) {
dfs(board);
}
public boolean dfs(char[][] board) {
for(int i=0;i<board.length;i++) {
for(int j=0;j<board.length;j++) {
if(board[i][j] != '.') {
continue;
}
// 填值
for(char t='1';t<='9';t++) {
if(checkRow(board,i,t) && checkCol(board,j,t) && checkSubBoard(board,i,j,t)) {
board[i][j] = t;
boolean ret = dfs(board);
if(ret) {
return true;
}
}
}
// 到这步说明所有值都不行
board[i][j] = '.';
return false;
}
}
return true;
}
public boolean checkRow(char[][] board, int row, char c) {
for(int i=0;i<board.length;i++) {
if(board[row][i] == c) {
return false;
}
}
return true;
}
public boolean checkCol(char[][] board, int col, char c) {
for(int i=0;i<board.length;i++) {
if(board[i][col] == c) {
return false;
}
}
return true;
}
public boolean checkSubBoard(char[][] board, int row, int col, char c) {
int subRow = (row/3)*3;
int subCol = (col/3)*3;
for(int i= subRow; i<subRow+3; i++) {
for(int j=subCol;j<subCol+3;j++) {
if(board[i][j] == c) {
return false;
}
}
}
return true;
}
浙公网安备 33010602011771号