[
dfs
hash table
2d-array
]
BinarySearch 0073 Sudoku Solver
Problem statement
https://binarysearch.com/problems/Sudoku-Solver/
Solution
Equal to Leetcode 0037. Sudoku Solver
Complexity
Time complexity of one dfs step is O(1), because we actually need to check row, column and box. However it is difficult to estimate overall complexity of algorithm - I think it is exponential at least. Space complexity is O(1).
Code
class Solution:
def solve(self, board):
def dfs(board, empty, rows, cols, boxes):
if not empty: return True
r, c = empty[-1]
for k in set(range(1,10)) - (rows[r]|cols[c]|boxes[3*(r//3)+c//3]):
board[r][c] = k
for dic in [rows[r], cols[c], boxes[3*(r//3)+c//3]]:
dic.add(k)
if dfs(board, empty[:-1], rows, cols, boxes): return True
board[r][c] = '.'
for dic in [rows[r], cols[c], boxes[3*(r//3)+c//3]]:
dic.remove(k)
return False
cols, rows, boxes, empty = defaultdict(set), defaultdict(set), defaultdict(set), []
for r, c in product(range(9), range(9)):
if board[r][c] == 0:
empty.append((r,c))
else:
for dic in [rows[r], cols[c], boxes[3*(r//3)+c//3]]:
dic.add(board[r][c])
dfs(board, empty, rows, cols, boxes)
return board