leetcode 37. Sudoku Solver 数独

17 篇文章 0 订阅
14 篇文章 0 订阅

思路

这是第一个自己解出来的Hard。用N皇后的递归思路,扫每一个空格,遍历1-9看可以放哪个数字,如果都不能放就清理现场回到上一层递归继续遍历。后来参考别人的思路,模拟人解题,先找出每个位置可以填的候选数,按照可填候选数的数目排序,从最少的开始填,这样剪枝掉一些不必要的计算。

代码

class Solution:
    def isValidPosition(self, n, row, col, board):
        for i in range(9):
            if board[row][i] == n:
                return False
            if board[i][col] == n:
                return False
            if board[3 * (row // 3) + i // 3][3 * (col // 3) + i % 3] == n:
                return False
        return True

    def solveSudoku(self, board):
        """
        :type board: List[List[str]]
        :rtype: void Do not return anything, modify board in-place instead.
        """
        blank = []
        for i in range(9):
            for j in range(9):
                if board[i][j] == '.':
                    valid_digit = []
                    for n in [chr(x) for x in range(49, 58)]:
                        if self.isValidPosition(n, i, j, board):
                            valid_digit.append(n)
                    blank.append((i, j, valid_digit))
        blank.sort(key=lambda x: len(x[2]))
        self.flag = 0

        def fill(pos, board):
            if pos == len(blank):
                self.flag = 1
                return
            for n in blank[pos][2]:
                if len(blank[pos][2]) == 1:
                    board[blank[pos][0]][blank[pos][1]] = n
                    fill(pos + 1, board)
                else:
                    if self.isValidPosition(n, blank[pos][0], blank[pos][1], board):
                        board[blank[pos][0]][blank[pos][1]] = n
                        fill(pos + 1, board)
                        if self.flag == 1:
                            break
                        board[blank[pos][0]][blank[pos][1]] = '.'

        fill(0, board)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值