@@ -293,85 +293,40 @@ class Solution:
293
293
"""
294
294
Do not return anything, modify board in-place instead.
295
295
"""
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无解
335
310
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):
338
317
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 ):
342
321
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
343
329
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()
375
330
```
376
331
377
332
Go:
0 commit comments