class Solution {
boolean[][] row = new boolean[9][9];
boolean[][] col = new boolean[9][9];
boolean[][][] cell = new boolean[3][3][9];
public void solveSudoku(char[][] board) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
char c = board[i][j];
if (c != '.') {
int t = c - '1';
row[i][t] = col[j][t] = cell[i / 3][j / 3][t] = true;
}
}
}
dfs(board, 0, 0);
}
private boolean dfs(char[][] board, int x, int y) {
//转向下一行
if (y == 9) return dfs(board, x + 1, 0);
if(x==9) return true;
if(board[x][y]!='.') return dfs(board, x, y + 1);
for (int i = 0; i < 9; i++) {
if (row[x][i] || col[y][i] || cell[x / 3][y / 3][i]) {
continue;
}
row[x][i] = col[y][i] = cell[x / 3][y / 3][i] = true;
board[x][y] = (char) (i + '1');
if(dfs(board, x, y + 1)) return true;
board[x][y] = '.';
row[x][i] = col[y][i] = cell[x / 3][y / 3][i] = false;
}
return false;
}
}