private boolean[][] r = new boolean[9][9];
private boolean[][] c = new boolean[9][9];
private boolean[][][] x = new boolean[3][3][9];
private boolean valid = false;
private List<int[]> list = 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] == '.') {
list.add(new int[] {i,j});
}
else {
int num = Integer.parseInt(String.valueOf(board[i][j])) - 1;
r[i][num] = c[j][num] = x[i/3][j/3][num] = true;
}
}
}
dfs(board, 0);
}
private void dfs(char[][] board, int pos) {
if(pos == list.size()) {
valid = true;
return;
}
int[] thisPos = list.get(pos);
int m = thisPos[0], n = thisPos[1];
for(int i = 0; i < 9 && !valid; i++) {
if(!r[m][i] && !c[n][i] && !x[m/3][n/3][i]) {
r[m][i] = c[n][i] = x[m/3][n/3][i] = true;
board[m][n] = (char) (i + '0' + 1);
dfs(board, pos+1);
r[m][i] = c[n][i] = x[m/3][n/3][i] = false;
}
}
}