找到存在的解:DFS + Backtracking
写solver时返回类型为boolean,考虑当某k从1-9都找不到解时,那么要返回false
public class Solution {
public void solveSudoku(char[][] board) {
solve(board);
}
public boolean solve(char[][] board) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] != '.') {
continue;
}
for (int k = 1; k <= 9; k++) {
board[i][j] = (char)(k + '0');
if (isValid(board, i, j) && solve(board)) {
return true;
}
board[i][j] = '.';
}
return false;
}
}
return true;
}
public boolean isValid(char[][] board, int a, int b) {
HashSet<Character> set = new HashSet<>();
// check row
for (int i = 0; i < 9; i++) {
if (set.contains(board[a][i])) {
return false;
}
if (board[a][i] > '0' && board[a][i] <= '9') {
set.add(board[a][i]);
}
}
// check column
set = new HashSet<>();
for (int j = 0; j < 9; j++) {
if (set.contains(board[j][b])) {
return false;
}
if (board[j][b] > '0' && board[j][b] <= '9') {
set.add(board[j][b]);
}
}
//check big cell
set = new HashSet<>();
for (int k = 0; k < 9; k++) {
char temp = board[a/3*3 + k/3][b/3*3 + k%3];
if (set.contains(temp)) {
return false;
}
if (temp > '0'&& temp <='9') {
set.add(temp);
}
}
return true;
}
}