Skip to content

Commit f88678d

Browse files
Merge pull request youngyangyang04#847 from casnz1601/patch-19
Update 0037.解数独.md
2 parents 50b573a + e2686eb commit f88678d

File tree

1 file changed

+30
-75
lines changed

1 file changed

+30
-75
lines changed

problems/0037.解数独.md

Lines changed: 30 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -293,85 +293,40 @@ class Solution:
293293
"""
294294
Do not return anything, modify board in-place instead.
295295
"""
296-
def backtrack(board):
297-
for i in range(len(board)): #遍历行
298-
for j in range(len(board[0])): #遍历列
299-
if board[i][j] != ".": continue
300-
for k in range(1,10): #(i, j) 这个位置放k是否合适
301-
if isValid(i,j,k,board):
302-
board[i][j] = str(k) #放置k
303-
if backtrack(board): return True #如果找到合适一组立刻返回
304-
board[i][j] = "." #回溯,撤销k
305-
return False #9个数都试完了,都不行,那么就返回false
306-
return True #遍历完没有返回false,说明找到了合适棋盘位置了
307-
def isValid(row,col,val,board):
308-
for i in range(9): #判断行里是否重复
309-
if board[row][i] == str(val):
310-
return False
311-
for j in range(9): #判断列里是否重复
312-
if board[j][col] == str(val):
313-
return False
314-
startRow = (row // 3) * 3
315-
startcol = (col // 3) * 3
316-
for i in range(startRow,startRow + 3): #判断9方格里是否重复
317-
for j in range(startcol,startcol + 3):
318-
if board[i][j] == str(val):
319-
return False
320-
return True
321-
backtrack(board)
322-
```
323-
324-
Python3:
325-
326-
```python3
327-
class Solution:
328-
def __init__(self) -> None:
329-
self.board = []
330-
331-
def isValid(self, row: int, col: int, target: int) -> bool:
332-
for idx in range(len(self.board)):
333-
# 同列是否重复
334-
if self.board[idx][col] == str(target):
296+
self.backtracking(board)
297+
298+
def backtracking(self, board: List[List[str]]) -> bool:
299+
# 若有解,返回True;若无解,返回False
300+
for i in range(len(board)): # 遍历行
301+
for j in range(len(board[0])): # 遍历列
302+
# 若空格内已有数字,跳过
303+
if board[i][j] != '.': continue
304+
for k in range(1, 10):
305+
if self.is_valid(i, j, k, board):
306+
board[i][j] = str(k)
307+
if self.backtracking(board): return True
308+
board[i][j] = '.'
309+
# 若数字1-9都不能成功填入空格,返回False无解
335310
return False
336-
# 同行是否重复
337-
if self.board[row][idx] == str(target):
311+
return True # 有解
312+
313+
def is_valid(self, row: int, col: int, val: int, board: List[List[str]]) -> bool:
314+
# 判断同一行是否冲突
315+
for i in range(9):
316+
if board[row][i] == str(val):
338317
return False
339-
# 9宫格里是否重复
340-
box_row, box_col = (row // 3) * 3 + idx // 3, (col // 3) * 3 + idx % 3
341-
if self.board[box_row][box_col] == str(target):
318+
# 判断同一列是否冲突
319+
for j in range(9):
320+
if board[j][col] == str(val):
342321
return False
322+
# 判断同一九宫格是否有冲突
323+
start_row = (row // 3) * 3
324+
start_col = (col // 3) * 3
325+
for i in range(start_row, start_row + 3):
326+
for j in range(start_col, start_col + 3):
327+
if board[i][j] == str(val):
328+
return False
343329
return True
344-
345-
def getPlace(self) -> List[int]:
346-
for row in range(len(self.board)):
347-
for col in range(len(self.board)):
348-
if self.board[row][col] == ".":
349-
return [row, col]
350-
return [-1, -1]
351-
352-
def isSolved(self) -> bool:
353-
row, col = self.getPlace() # 找个空位置
354-
355-
if row == -1 and col == -1: # 没有空位置,棋盘被填满的
356-
return True
357-
358-
for i in range(1, 10):
359-
if self.isValid(row, col, i): # 检查这个空位置放i,是否合适
360-
self.board[row][col] = str(i) # 放i
361-
if self.isSolved(): # 合适,立刻返回, 填下一个空位置。
362-
return True
363-
self.board[row][col] = "." # 不合适,回溯
364-
365-
return False # 空位置没法解决
366-
367-
def solveSudoku(self, board: List[List[str]]) -> None:
368-
"""
369-
Do not return anything, modify board in-place instead.
370-
"""
371-
if board is None or len(board) == 0:
372-
return
373-
self.board = board
374-
self.isSolved()
375330
```
376331

377332
Go:

0 commit comments

Comments
 (0)