# 检查(x,y)位置填入num是否合法
def is_valid(board, x, y, num):
# 检查行
for i in range(9):
if board[x][i] == num:
return False
# 检查列
for i in range(9):
if board[i][y] == num:
return False
# 检查3×3宫
sx = x // 3 * 3
sy = y // 3 * 3
for i in range(3):
for j in range(3):
if board[sx+i][sy+j] == num:
return False
return True
# DFS回溯求解数独
def dfs(board):
for i in range(9):
for j in range(9):
if board[i][j] == 0:
for num in range(1, 10):
if is_valid(board, i, j, num):
board[i][j] = num
if dfs(board):
return True
board[i][j] = 0 # 回溯
return False
return True
# 主程序
if __name__ == "__main__":
board = []
# 读取9行空格分隔的数独输入(0表示空白)
for _ in range(9):
line = input().strip()
row = list(map(int, line.split()))
board.append(row)
# 求解并按标准格式输出
if dfs(board):
for row in board:
print(' '.join(map(str, row)))
else:
print("无解")
核心点
数独 / 皇后问题通用逻辑
回溯核心
「试填→验证→递归→回溯」:试选一个值→验证合法性→递归填下一个→错了就回退(恢复现场)
终止条件
所有位置填完(数独无 0 / 皇后放满 N 个)→返回 True;某位置无合法值→返回 False 触发回溯