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)