zoukankan      html  css  js  c++  java
  • 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 class Solution(object):
     2     def validset(self ):
     3         s='123456789'
     4         return set(s)
     5 
     6     def initTbl(self, tbl, board):
     7         for i in range(9):
     8             for j in range(9):
     9                 if board[i][j] == '.':
    10                     tbl[(i,j)]=[]
    11 
    12 
    13     def solveSudoku(self, board):
    14         """
    15         :type board: List[List[str]]
    16         :rtype: bool
    17         """
    18         resultTbl={}
    19         visited=[]
    20         self.initTbl(resultTbl, board)
    21         reuse=False
    22         unvisited = resultTbl.keys()
    23         unvisited.sort()
    24         unvisited.reverse()
    25 
    26         while unvisited != []:
    27             (x, y) = unvisited.pop()
    28             if reuse==False:
    29                 resultTbl[(x,y)] = self.possibleValues((x,y), board)
    30                 if resultTbl[(x,y)] == None: # invalid sudoku
    31                     print False
    32                     break
    33 
    34             if len( resultTbl[(x,y)] ) == 0: # DEAD END, BACKTRACK
    35                 unvisited.append((x, y))
    36                 if visited != []:
    37                     reuse=True
    38                     prev=visited.pop()
    39                     unvisited.append(prev)
    40                     x=prev[0]
    41                     y=prev[1]
    42                     board[x][y]='.'
    43                 else:
    44                     break
    45                 continue
    46             board[x][y]=resultTbl[(x,y)].pop()
    47             visited.append((x,y))
    48             reuse=False
    49         for line in board:
    50             if '.' in line:
    51                 print False
    52 
    53 
    54     def possibleValues(self, coord, board):
    55         vals = {'.':0}
    56         for i in range(1,10): #init
    57             vals[str(i)]=0
    58 
    59         for y in range(0,9):
    60             node=board[coord[0]][y]
    61             vals[node]+=1
    62             if vals[node]>1 and node!='.': return None
    63         for x in range(0,9):
    64             node=board[x][coord[1]]
    65             vals[node]+=1
    66             if vals[node] > 2 and node!='.': return None
    67         x = coord[0]/3*3
    68         y = coord[1]/3*3
    69         for i in range(x, x+3):
    70             for j in range(y, y+3):
    71                 node=board[i][j]
    72                 vals[node]+=1
    73                 if vals[node]>3 and node!='.': return None
    74         s = set()
    75         for k in vals.keys():
    76             if vals[k]>=1: s.add(k)
    77         return self.validset() - s
  • 相关阅读:
    sql2slack alash3al 开源的又个轻量级工具
    pgspider fetchq 扩展docker镜像
    godns 集成coredns 的demo
    godns 简单dnsmasq 的dns 替换方案
    aviary.sh 一个基于bash的分布式配置管理工具
    使用coredns 的template plugin实现一个xip 服务
    nginx 代理 coredns dns 服务
    基于nginx proxy dns server
    几个不错的geodns server
    spring boot rest api 最好添加servlet.context-path
  • 原文地址:https://www.cnblogs.com/scottgu/p/5063370.html
Copyright © 2011-2022 走看看