37. 解数独

题目描述:编写一个程序,通过填充空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.’ 表示。
解题思路:思路和N皇后问题是一样的,只是在找到正确答案之后就要停止递归和回溯,此外每个3*3的block的访问下标需要正确计算,代码如下:

class Solution:
    def solveSudoku(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        rows = [[False]*9 for _ in range(9)]
        cols = [[False]*9 for _ in range(9)]
        blocks = [[False]*9 for _ in range(9)]
        for i in range(9):
            for j in range(9):
                if board[i][j] != '.':
                    num = int(board[i][j])-1
                    rows[i][num] = True
                    cols[j][num] = True
                    idx = i // 3 * 3 + j // 3
                    # print(idx, num)
                    blocks[idx][num] = True
        flag = False 
        # print(blocks)
        def traceback(x, y):
            nonlocal flag
            if x >= 9:
                y += 1
                x = 0
            if y >= 9:
                flag = True
                return
            # print(x, y)
            if board[y][x] != '.':
                traceback(x+1, y)
                return 
            idx = x//3+y//3*3
            for i in range(9):
                if not rows[y][i] and not cols[x][i] and not blocks[idx][i]:
                    board[y][x] = str(i+1)
                    rows[y][i] = True
                    cols[x][i] = True
                    blocks[idx][i] = True
                    traceback(x+1, y)
                    if flag:
                        return
                    rows[y][i] = False
                    cols[x][i] = False
                    blocks[idx][i] = False
                    board[y][x] = '.'
                
                    
        traceback(0, 0)

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值