Skip to content

Commit 630bff9

Browse files
authored
Implement Sudoku solver using backtracking
1 parent 10a0de1 commit 630bff9

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

Sudoku Solver.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
class Solution {
2+
private boolean ok;
3+
private char[][] board;
4+
private List<Integer> t = new ArrayList<>();
5+
private boolean[][] row = new boolean[9][9];
6+
private boolean[][] col = new boolean[9][9];
7+
private boolean[][][] block = new boolean[3][3][9];
8+
9+
public void solveSudoku(char[][] board) {
10+
this.board = board;
11+
for (int i = 0; i < 9; ++i) {
12+
for (int j = 0; j < 9; ++j) {
13+
if (board[i][j] == '.') {
14+
t.add(i * 9 + j);
15+
} else {
16+
int v = board[i][j] - '1';
17+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = true;
18+
}
19+
}
20+
}
21+
dfs(0);
22+
}
23+
24+
private void dfs(int k) {
25+
if (k == t.size()) {
26+
ok = true;
27+
return;
28+
}
29+
int i = t.get(k) / 9, j = t.get(k) % 9;
30+
for (int v = 0; v < 9; ++v) {
31+
if (!row[i][v] && !col[j][v] && !block[i / 3][j / 3][v]) {
32+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = true;
33+
board[i][j] = (char) (v + '1');
34+
dfs(k + 1);
35+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = false;
36+
}
37+
if (ok) {
38+
return;
39+
}
40+
}
41+
}
42+
}

0 commit comments

Comments
 (0)