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的节点,不存在的情况下选择长度最短的节点