题解 | #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]]))

全部评论
应该是DFS吧,我自己也不清楚
点赞 回复 分享
发布于 2022-06-30 22:18

相关推荐

评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务