题解 | #Sudoku#
Sudoku
https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1
m = [] # 二维数组用来存储
for _ in range(9):
m.append(list(map(int, input().split())))
def get_maybe_value(x, y): # 获取当前位置允许的值
all_n = {1, 2, 3, 4, 5, 6, 7, 8, 9}
row = [m[x][j] for j in range(9)] # 获取当前所在行的所有元素
col = [m[i][y] for i in range(9)] # 获取当前所在列的所有元素
box = [m[i][j] for i in range((x//3)*3, (x//3)*3+3) for j in range((y//3)*3, (y//3)*3+3)] # 获取当前所在宫的所有元素
value = list(all_n - set(row) - set(col) - set(box)) # 取差集获取当前位置允许填入的所有值
return value
def solo():
x, y = -1, -1
for i in range(9):
for j in range(9):
if m[i][j] == 0 and x == -1: # 寻找第一个未填入值的位置
x, y = i, j
break
if x == -1: # 如果找不到还空着的位置,代表数独已经被填完了
return True
for v in get_maybe_value(x, y): # 遍历该位置允许填入的值,如果前面某个位置填入的值是错误的,这里会返回一个空列表,代表没有可以填的值,循环结束后返回False
m[x][y] = v # 填入该值
if not solo(): # 递归进去开始填下一个空着的位置
m[x][y] = 0 # 如果返回False,代表当前位置填入的值是错误的,会与后面填入的值产生冲突
else:
return True # 当数独填完整了,才会走到这里返回True
return False
solo()
for i in range(9):
print(' '.join([str(x) for x in m[i]]))

