题解 | Sudoku
Sudoku
https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1
import sys
def solve(board):
def is_valid(x, y, val):
# 检查行
for j in range(9):
if board[x][j] == val:
return False
# 检查列
for i in range(9):
if board[i][y] == val:
return False
# 检查3x3宫
start_x, start_y = (x // 3) * 3, (y // 3) * 3
for i in range(start_x, start_x + 3):
for j in range(start_y, start_y + 3):
if board[i][j] == val:
return False
return True
def dfs():
for i in range(9):
for j in range(9):
if board[i][j] == 0:
for num in range(1, 10):
if is_valid(i, j, num): # 这一部就是检查行列宫中有没有该数,没有就赋值。
board[i][j] = num
if dfs(): # 老朋友递归了
return True
board[i][j] = 0 # 谈判失败,开始回溯
return False # 1~9都试过都不行
return True # 没有0了,填满了
dfs()
return board
# 输入处理
board = []
for _ in range(9): # 循环9次,_ 表示“不在乎这个变量叫什么”
line = sys.stdin.readline().strip() # 读一行
nums = line.split() # 分开["0","9","2","4","8","1","7","6","3"]
row = [] # 准备存这一行的整数
for s in nums: # 遍历每个字符串
row.append(int(s)) # 转整数并添加
board.append(row) # 把这行加入大列表
# 求解
solve(board)
# 输出
for row in board:
print(" ".join(map(str, row)))
所以困难都得递归绕是吧....
OPPO公司福利 1225人发布