题解 | #Sudoku#
Sudoku
https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1
import sys
def check(board, x, y):
for i in range(9):
if i != x and board[i][y] == board[x][y]: #检查行
return False
if i != y and board[x][i] == board[x][y]: #检查列
return False
m = (x//3)*3 # 0 1 2 -> 0 3 6
n = (y//3)*3 # 0 1 2 -> 0 3 6
for i in range(m,m+3): #检查3x3
for j in range(n,n+3):
if(i!=x or j!=y) and board[i][j] == board[x][y]:
return False
return True
def dfs(board):
for i in range(9):
for j in range(9):
if board[i][j] == 0:
for v in range(1,10): # 0-9试数字
board[i][j] = v
if check(board,i,j) and dfs(board):
return True #添加成功,跳出循环
board[i][j] = 0 #当前数值不行,把值改回0
return False # 这一轮的False是因为上一轮没填对,【回溯到上一轮重新填】!!
return True
while 1:
try:
sudoku = [[] for i in range(9)]
for i in range(9): #录入2d list
sudoku[i] = list(map(int, input().split(' ')))
dfs(sudoku)
for i in sudoku:
for j in i:
print(j, end=' ')
print()
except:
break
