LeetCode刷题(8)

来源:互联网 发布:osi网络模型 编辑:程序博客网 时间:2024/06/15 14:35

Python数独求解
思路,先确定由行、列和小方块约束后的可能的数值集合,而后一一尝试,进行递归。

    def solveSudoku(self, board):        """        :type board: List[List[str]]        :rtype: void Do not return anything, modify board in-place instead.        """        self.board = board        self.solve()    def solve(self):        flag = 1        for i in xrange(9):            for j in xrange(9):                if self.board[i][j] == '.':                    flag = 0                    row = self.board[i]                    row_valid = self.num_valid(row)                    col = zip(*self.board)[j]                    col_valid = self.num_valid(col)                    square_i = i / 3                    square_j = j / 3                    square = [self.board[x][y] for x in range(square_i*3,square_i*3+3) for y in range(square_j*3,square_j*3+3)]                    square_valid = self.num_valid(square)                    valid = row_valid & col_valid & square_valid                    valid_list = [k for k in valid]                    if len(valid_list) == 0:                        return False                    else:                        print valid_list                        for num in valid_list:                            self.board[i][j] = num                            if self.solve():                                return True                            self.board[i][j] = '.'                        return False        if flag:            return True    def num_valid(self, unit):        num = set('123456789')        num_unit = set()        unit = [i for i in unit if i != '.']        for i in unit:            num_unit.add(i)        return num - num_unit

报错:
self.board[i][j] = num: TypeError: ‘unicode’ object does not support item assignment
修改为self.board[i] = self.board[i][0:j]+num+self.board[i][j+1:],后同
此处为LeetCode测试数据,与提交数据格式不统一

算法优化:首先搜索候选长度为1的节点,不存在的情况下选择长度最短的节点

原创粉丝点击