Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 7749510

Browse files
committed
feat: add solutions to lc problem: No.0037
No.0037.Sudoku Solver
1 parent 141ff97 commit 7749510

File tree

6 files changed

+481
-42
lines changed

6 files changed

+481
-42
lines changed

‎solution/0000-0099/0037.Sudoku Solver/README.md‎

Lines changed: 173 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,194 @@
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54+
**方法一:回溯**
55+
56+
我们用数组 `row``col``box` 分别记录每一行、每一列、每个 3x3 宫格中数字是否出现过。如果数字 `i` 在第 `r` 行、第 `c` 列、第 `b` 个 3x3 宫格中出现过,那么 `row[r][i]``col[c][i]``box[b][i]` 都为 `true`
57+
58+
我们遍历 `board` 的每一个空格,枚举它可以填入的数字 `v`,如果 `v` 在当前行、当前列、当前 3x3 宫格中没有出现过,那么我们就可以尝试填入数字 `v`,并继续搜索下一个空格。如果搜索到最后,所有空格填充完毕,那么就说明找到了一个可行解。
59+
60+
时间复杂度 $O(9^{81}),ドル空间复杂度 $O(9^2)$。
61+
5462
<!-- tabs:start -->
5563

5664
### **Python3**
5765

5866
<!-- 这里可写当前语言的特殊实现逻辑 -->
5967

6068
```python
61-
69+
class Solution:
70+
def solveSudoku(self, board: List[List[str]]) -> None:
71+
def dfs(k):
72+
nonlocal ok
73+
if k == len(t):
74+
ok = True
75+
return
76+
i, j = t[k]
77+
for v in range(9):
78+
if row[i][v] == col[j][v] == block[i // 3][j // 3][v] == False:
79+
row[i][v] = col[j][v] = block[i // 3][j // 3][v] = True
80+
board[i][j] = str(v + 1)
81+
dfs(k + 1)
82+
row[i][v] = col[j][v] = block[i // 3][j // 3][v] = False
83+
if ok:
84+
return
85+
86+
row = [[False] * 9 for _ in range(9)]
87+
col = [[False] * 9 for _ in range(9)]
88+
block = [[[False] * 9 for _ in range(3)] for _ in range(3)]
89+
t = []
90+
ok = False
91+
for i in range(9):
92+
for j in range(9):
93+
if board[i][j] == '.':
94+
t.append((i, j))
95+
else:
96+
v = int(board[i][j]) - 1
97+
row[i][v] = col[j][v] = block[i // 3][j // 3][v] = True
98+
dfs(0)
6299
```
63100

64101
### **Java**
65102

66103
<!-- 这里可写当前语言的特殊实现逻辑 -->
67104

68105
```java
106+
class Solution {
107+
private boolean ok;
108+
private char[][] board;
109+
private List<Integer> t = new ArrayList<>();
110+
private boolean[][] row = new boolean[9][9];
111+
private boolean[][] col = new boolean[9][9];
112+
private boolean[][][] block = new boolean[3][3][9];
113+
114+
public void solveSudoku(char[][] board) {
115+
this.board = board;
116+
for (int i = 0; i < 9; ++i) {
117+
for (int j = 0; j < 9; ++j) {
118+
if (board[i][j] == '.') {
119+
t.add(i * 9 + j);
120+
} else {
121+
int v = board[i][j] - '1';
122+
row[i][v] = true;
123+
col[j][v] = true;
124+
block[i / 3][j / 3][v] = true;
125+
}
126+
}
127+
}
128+
dfs(0);
129+
}
130+
131+
private void dfs(int k) {
132+
if (k == t.size()) {
133+
ok = true;
134+
return;
135+
}
136+
int i = t.get(k) / 9, j = t.get(k) % 9;
137+
for (int v = 0; v < 9; ++v) {
138+
if (!row[i][v] && !col[j][v] && !block[i / 3][j / 3][v]) {
139+
row[i][v] = true;
140+
col[j][v] = true;
141+
block[i / 3][j / 3][v] = true;
142+
board[i][j] = (char) (v + '1');
143+
dfs(k + 1);
144+
row[i][v] = false;
145+
col[j][v] = false;
146+
block[i / 3][j / 3][v] = false;
147+
}
148+
if (ok) {
149+
return;
150+
}
151+
}
152+
}
153+
}
154+
```
155+
156+
### **C++**
157+
158+
```cpp
159+
using pii = pair<int, int>;
160+
161+
class Solution {
162+
public:
163+
void solveSudoku(vector<vector<char>>& board) {
164+
bool row[9][9] = {false};
165+
bool col[9][9] = {false};
166+
bool block[3][3][9] = {false};
167+
bool ok = false;
168+
vector<pii> t;
169+
for (int i = 0; i < 9; ++i) {
170+
for (int j = 0; j < 9; ++j) {
171+
if (board[i][j] == '.') {
172+
t.push_back({i, j});
173+
} else {
174+
int v = board[i][j] - '1';
175+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = true;
176+
}
177+
}
178+
}
179+
function<void(int k)> dfs;
180+
dfs = [&](int k) {
181+
if (k == t.size()) {
182+
ok = true;
183+
return;
184+
}
185+
int i = t[k].first, j = t[k].second;
186+
for (int v = 0; v < 9; ++v) {
187+
if (!row[i][v] && !col[j][v] && !block[i / 3][j / 3][v]) {
188+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = true;
189+
board[i][j] = v + '1';
190+
dfs(k + 1);
191+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = false;
192+
}
193+
if (ok) {
194+
return;
195+
}
196+
}
197+
};
198+
dfs(0);
199+
}
200+
};
201+
```
69202
203+
### **Go**
204+
205+
```go
206+
func solveSudoku(board [][]byte) {
207+
var row, col [9][9]bool
208+
var block [3][3][9]bool
209+
var t [][2]int
210+
ok := false
211+
for i := 0; i < 9; i++ {
212+
for j := 0; j < 9; j++ {
213+
if board[i][j] == '.' {
214+
t = append(t, [2]int{i, j})
215+
} else {
216+
v := int(board[i][j] - '1')
217+
row[i][v], col[j][v], block[i/3][j/3][v] = true, true, true
218+
}
219+
}
220+
}
221+
var dfs func(int)
222+
dfs = func(k int) {
223+
if k == len(t) {
224+
ok = true
225+
return
226+
}
227+
i, j := t[k][0], t[k][1]
228+
for v := 0; v < 9; v++ {
229+
if !row[i][v] && !col[j][v] && !block[i/3][j/3][v] {
230+
row[i][v], col[j][v], block[i/3][j/3][v] = true, true, true
231+
board[i][j] = byte(v + '1')
232+
dfs(k + 1)
233+
row[i][v], col[j][v], block[i/3][j/3][v] = false, false, false
234+
}
235+
if ok {
236+
return
237+
}
238+
}
239+
}
240+
dfs(0)
241+
}
70242
```
71243

72244
### **...**

‎solution/0000-0099/0037.Sudoku Solver/README_EN.md‎

Lines changed: 165 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,177 @@
4444
### **Python3**
4545

4646
```python
47-
47+
class Solution:
48+
def solveSudoku(self, board: List[List[str]]) -> None:
49+
def dfs(k):
50+
nonlocal ok
51+
if k == len(t):
52+
ok = True
53+
return
54+
i, j = t[k]
55+
for v in range(9):
56+
if row[i][v] == col[j][v] == block[i // 3][j // 3][v] == False:
57+
row[i][v] = col[j][v] = block[i // 3][j // 3][v] = True
58+
board[i][j] = str(v + 1)
59+
dfs(k + 1)
60+
row[i][v] = col[j][v] = block[i // 3][j // 3][v] = False
61+
if ok:
62+
return
63+
64+
row = [[False] * 9 for _ in range(9)]
65+
col = [[False] * 9 for _ in range(9)]
66+
block = [[[False] * 9 for _ in range(3)] for _ in range(3)]
67+
t = []
68+
ok = False
69+
for i in range(9):
70+
for j in range(9):
71+
if board[i][j] == '.':
72+
t.append((i, j))
73+
else:
74+
v = int(board[i][j]) - 1
75+
row[i][v] = col[j][v] = block[i // 3][j // 3][v] = True
76+
dfs(0)
4877
```
4978

5079
### **Java**
5180

5281
```java
82+
class Solution {
83+
private boolean ok;
84+
private char[][] board;
85+
private List<Integer> t = new ArrayList<>();
86+
private boolean[][] row = new boolean[9][9];
87+
private boolean[][] col = new boolean[9][9];
88+
private boolean[][][] block = new boolean[3][3][9];
89+
90+
public void solveSudoku(char[][] board) {
91+
this.board = board;
92+
for (int i = 0; i < 9; ++i) {
93+
for (int j = 0; j < 9; ++j) {
94+
if (board[i][j] == '.') {
95+
t.add(i * 9 + j);
96+
} else {
97+
int v = board[i][j] - '1';
98+
row[i][v] = true;
99+
col[j][v] = true;
100+
block[i / 3][j / 3][v] = true;
101+
}
102+
}
103+
}
104+
dfs(0);
105+
}
106+
107+
private void dfs(int k) {
108+
if (k == t.size()) {
109+
ok = true;
110+
return;
111+
}
112+
int i = t.get(k) / 9, j = t.get(k) % 9;
113+
for (int v = 0; v < 9; ++v) {
114+
if (!row[i][v] && !col[j][v] && !block[i / 3][j / 3][v]) {
115+
row[i][v] = true;
116+
col[j][v] = true;
117+
block[i / 3][j / 3][v] = true;
118+
board[i][j] = (char) (v + '1');
119+
dfs(k + 1);
120+
row[i][v] = false;
121+
col[j][v] = false;
122+
block[i / 3][j / 3][v] = false;
123+
}
124+
if (ok) {
125+
return;
126+
}
127+
}
128+
}
129+
}
130+
```
131+
132+
### **C++**
133+
134+
```cpp
135+
using pii = pair<int, int>;
136+
137+
class Solution {
138+
public:
139+
void solveSudoku(vector<vector<char>>& board) {
140+
bool row[9][9] = {false};
141+
bool col[9][9] = {false};
142+
bool block[3][3][9] = {false};
143+
bool ok = false;
144+
vector<pii> t;
145+
for (int i = 0; i < 9; ++i) {
146+
for (int j = 0; j < 9; ++j) {
147+
if (board[i][j] == '.') {
148+
t.push_back({i, j});
149+
} else {
150+
int v = board[i][j] - '1';
151+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = true;
152+
}
153+
}
154+
}
155+
function<void(int k)> dfs;
156+
dfs = [&](int k) {
157+
if (k == t.size()) {
158+
ok = true;
159+
return;
160+
}
161+
int i = t[k].first, j = t[k].second;
162+
for (int v = 0; v < 9; ++v) {
163+
if (!row[i][v] && !col[j][v] && !block[i / 3][j / 3][v]) {
164+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = true;
165+
board[i][j] = v + '1';
166+
dfs(k + 1);
167+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = false;
168+
}
169+
if (ok) {
170+
return;
171+
}
172+
}
173+
};
174+
dfs(0);
175+
}
176+
};
177+
```
53178
179+
### **Go**
180+
181+
```go
182+
func solveSudoku(board [][]byte) {
183+
var row, col [9][9]bool
184+
var block [3][3][9]bool
185+
var t [][2]int
186+
ok := false
187+
for i := 0; i < 9; i++ {
188+
for j := 0; j < 9; j++ {
189+
if board[i][j] == '.' {
190+
t = append(t, [2]int{i, j})
191+
} else {
192+
v := int(board[i][j] - '1')
193+
row[i][v], col[j][v], block[i/3][j/3][v] = true, true, true
194+
}
195+
}
196+
}
197+
var dfs func(int)
198+
dfs = func(k int) {
199+
if k == len(t) {
200+
ok = true
201+
return
202+
}
203+
i, j := t[k][0], t[k][1]
204+
for v := 0; v < 9; v++ {
205+
if !row[i][v] && !col[j][v] && !block[i/3][j/3][v] {
206+
row[i][v], col[j][v], block[i/3][j/3][v] = true, true, true
207+
board[i][j] = byte(v + '1')
208+
dfs(k + 1)
209+
row[i][v], col[j][v], block[i/3][j/3][v] = false, false, false
210+
}
211+
if ok {
212+
return
213+
}
214+
}
215+
}
216+
dfs(0)
217+
}
54218
```
55219

56220
### **...**

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /