Leetcode:Sudoku Solver (python)

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值