diff --git a/Sudoku Solver.java b/Sudoku Solver.java new file mode 100644 index 000000000..bd43c1151 --- /dev/null +++ b/Sudoku Solver.java @@ -0,0 +1,42 @@ +class Solution { + private boolean ok; + private char[][] board; + private List t = new ArrayList<>(); + private boolean[][] row = new boolean[9][9]; + private boolean[][] col = new boolean[9][9]; + private boolean[][][] block = new boolean[3][3][9]; + + public void solveSudoku(char[][] board) { + this.board = board; + for (int i = 0; i < 9; ++i) { + for (int j = 0; j < 9; ++j) { + if (board[i][j] == '.') { + t.add(i * 9 + j); + } else { + int v = board[i][j] - '1'; + row[i][v] = col[j][v] = block[i / 3][j / 3][v] = true; + } + } + } + dfs(0); + } + + private void dfs(int k) { + if (k == t.size()) { + ok = true; + return; + } + int i = t.get(k) / 9, j = t.get(k) % 9; + for (int v = 0; v < 9; ++v) { + if (!row[i][v] && !col[j][v] && !block[i / 3][j / 3][v]) { + row[i][v] = col[j][v] = block[i / 3][j / 3][v] = true; + board[i][j] = (char) (v + '1'); + dfs(k + 1); + row[i][v] = col[j][v] = block[i / 3][j / 3][v] = false; + } + if (ok) { + return; + } + } + } +}