# 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():
77         return self.validset() - s