36. 有效的数独
class Solution {
// 行row[i][digit]:每i行存在的数字是digit
private boolean[][] row = new boolean[9][9];
// 列column[j][digit]:每j列存在的数字是digit
private boolean[][] column = new boolean[9][9];
// 块block[i][j][digit]:3x3块中(i, j)存在的数字是digit
private boolean[][][] block = new boolean[3][3][9];
// valid: 是否符合条件
private boolean valid = false;
// 每个空格的位置
private List<int[]> spaces = new ArrayList<int[]>();
public void solveSudoku(char[][] board) {
for (int i = 0; i < 9; i++){
for (int j = 0; j < 9; j++){
if (board[i][j] == '.'){
spaces.add(new int[]{i, j});
} else {
int digit = board[i][j] - '0' - 1; // 0 - 8
row[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = true;
}
}
}
dfs(board, 0);
}
public void dfs(char[][] board, int pos){
if (pos == spaces.size()){
valid = true;
return;
}
int[] space = spaces.get(pos);
int i = space[0];
int j = space[1];
for (int digit = 0; digit < 9 && !valid; digit++){
if (!row[i][digit] && !column[j][digit] && !block[i / 3][j / 3][digit]){
row[i][digit] = column[j][digit] = block[i/3][j/3][digit] = true;
board[i][j] = (char)(digit + '0' + 1); // 1 - 9
dfs(board, pos + 1);
row[i][digit] = column[j][digit] = block[i/3][j/3][digit] = false;
}
}
}
}