Leetcode:Sudoku Solver (python)

来源:互联网 发布:如何安装vb 编辑:程序博客网 时间:2024/06/05 22:30

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 = Falsewhile 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


0 0
原创粉丝点击