一、题目
描述
问题描述:数独(Sudoku)是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字,推算出所有剩余空格的数字,并且满足每一行、每一列、每一个3X3粗线宫内的数字均含1-9,并且不重复。
例如:
输入
输出
数据范围:输入一个 9*9 的矩阵
输入描述:
包含已知数字的9X9盘面数组[空缺位以数字0表示]
输出描述:
完整的9X9盘面数组
二、示例
三、代码
def is_legal(board, x, y): # 判断填入的数字是否有重复
for i in range(9): # 判断填入的数字在列中是否有重复
if i != x and board[i][y] == board[x][y]:
return False
for j in range(9): # 判断填入的数字在行中是否有重复
if j != y and board[x][j] == board[x][y]:
return False
m, n = 3*(x // 3), 3*(y // 3) # 计算3x3网格的左上角的坐标
for i in range(3): # 判断填入的数字在粗线宫内是否有重复
for j in range(3):
if (i+m != x or j+n != y) and board[i+m][j+n] == 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 k in '123456789':
board[i][j] = int(k)
if is_legal(board, i, j) and dfs(board):
return True
board[i][j] = 0
return False # 上一步的数字不合理
return True # 全部填完
while True:
try:
board = []
for i in range(9):
board.append(list(map(int, input().split())))
dfs(board)
for i in range(9):
board[i] = list(map(str, board[i]))
print(' '.join(board[i]))
except:
break
四、算法说明
- 建立函数
is_legal(board, x, y)
,判断填入数字的合法性,判断填入数字所在行、列、粗线宫内是否有重复。 - 建立函数
dfs(board)
,进行递归,对所有的空格进行遍历,从'123456789'
中选择数字,逐个进行递归检验,直到遍历完所有的空格。
胡萝卜
2022年3月21日23:20:54
我不知道将去向何方,但我已在路上! |
---|
时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 ! |