DFS
- 分别记录 '0' 所在位置
- 从第一个 '0' 开始,获取该位置能填入的数字集合,遍历该集合,遍历该集合,遍历结束后给该位置重新赋值为 '0'
- 如果获取能填入的数字集合抛出IndexError异常,就说明最后一个'0'已经填入,打印结果并退出
以下为python代码实现
a = []
b = []
full_set = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
# 记录输入
for _ in range(9):
a += input().split()
# 记录 '0' 的位置
for i, v in enumerate(a):
if v == '0':
b.append(i)
# 获取该位置能填入的数字集合
def get_set(a, pos):
# 获取行集合
row_start = pos // 9 * 9
row_set = set(a[row_start: row_start + 9])
# 获取列集合
col_start = pos % 9
col_set = set()
for j in range(9):
col_set.add(a[j*9 + col_start])
# 获取3x3集合
s_start = row_start // 3 * 27 + col_start // 3 * 3
s_arr = []
for j in range(3):
temp = j*9 + s_start
s_arr += a[temp:temp + 3]
s_set = set(s_arr)
# 返回可以填入的数字集合
return (row_set | col_set | s_set) ^ full_set
def handle(a, i):
try:
temp = get_set(a, b[i])
except IndexError: # 如果抛出 IndexError 则最后一个 '0'已经填入,打印结果并退出
for k in range(9):
p_start = k * 9
print(' '.join(a[p_start: p_start + 9]))
exit()
for j in temp:
a[b[i]] = j
handle(a, i + 1)
a[b[i]] = '0'
handle(a, 0)