题解 | Sudoku

Sudoku

https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1

import sys

def solve(board):
    def is_valid(x, y, val):
        # 检查行
        for j in range(9):
            if board[x][j] == val:
                return False
        # 检查列
        for i in range(9):
            if board[i][y] == val:
                return False
        # 检查3x3宫
        start_x, start_y = (x // 3) * 3, (y // 3) * 3
        for i in range(start_x, start_x + 3):
            for j in range(start_y, start_y + 3):
                if board[i][j] == val:
                    return False
        return True

    def dfs():
        for i in range(9):
            for j in range(9):
                if board[i][j] == 0:
                    for num in range(1, 10):
                        if is_valid(i, j, num):  # 这一部就是检查行列宫中有没有该数,没有就赋值。
                            board[i][j] = num
                            if dfs():  # 老朋友递归了
                                return True
                            board[i][j] = 0  # 谈判失败,开始回溯
                    return False  # 1~9都试过都不行
        return True  # 没有0了,填满了

    dfs()
    return board


# 输入处理
board = []

for _ in range(9):  # 循环9次,_ 表示“不在乎这个变量叫什么”
    line = sys.stdin.readline().strip()  # 读一行
    nums = line.split()  # 分开["0","9","2","4","8","1","7","6","3"]
    row = []  # 准备存这一行的整数
    for s in nums:  # 遍历每个字符串
        row.append(int(s))  # 转整数并添加
    board.append(row)  # 把这行加入大列表

# 求解
solve(board)

# 输出
for row in board:
    print(" ".join(map(str, row)))

所以困难都得递归绕是吧....

全部评论

相关推荐

01-12 20:31
东北大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务