Leetcode:
Sudoku Solver
Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character '.'
.
You may assume that there will be only one unique solution.
A sudoku puzzle...
...and its solution numbers marked in red.
1、先找横、竖和每9个的小矩阵中可能出现的数字。
2、找每个空的以上三个部分的交集,交集数为1的就为这个空改填的数。
3、循环查找,直到所有的数都被找到。
board = [
[5,3,'.','.',7,'.','.','.','.'],
[6,'.','.',1,9,5,'.','.','.'],
['.',9,8,'.','.','.','.',6,'.'],
[8,'.','.','.',6,'.','.','.',3],
[4,'.','.',8,'.',3,'.','.',1],
[7,'.','.','.',2,'.','.','.',6],
['.',6,'.','.','.','.',2,8,'.'],
['.','.','.',4,1,9,'.','.',5],
['.','.','.','.',8,'.','.',7,9]
]
base = [i for i in range(1,10)]
horSum = [filter(lambda x:x != '.' and x not in i,base) for i in board]
verSum = [filter(lambda x:x != '.' and x not in i,base) for i in map(list,zip(*board))]
boaSum = []
for i in range(1,4):
for j in range(1,4):
tempList = list([board[(i-1)*3:i*3][k][(j-1)*3:j*3] for k in range(3)])
tempList = tempList[0]+tempList[1]+tempList[2]
boaSum.append(filter(lambda x:x!='.' and x not in tempList,base))
def judge(i,j):
if i < 3:
l = [0,1,2]
elif i > 5:
l = [6,7,8]
else:
l = [3,4,5]
if j < 3:
r = [0,3,6]
elif j > 5:
r = [2,5,8]
else:
r = [1,4,7]
return [i for i in l if i in r][0]
success = False
while not success:
for i in range(9):
success = True
for j in range(9):
if board[i][j] == '.':
success = False
nums = [nn for nn in horSum[i] if nn in verSum[j] and nn in boaSum[judge(i,j)]]
#if i == 4:
# print i,j,judge(i,j)
# print horSum[i],verSum[j],boaSum[judge(i,j)]
# print nums
if len(nums) == 1:
board[i][j] = nums[0]
horSum[i].remove(nums[0])
verSum[j].remove(nums[0])
boaSum[judge(i,j)].remove(nums[0])
print board