Skip to content

Instantly share code, notes, and snippets.

@ttsugriy
Created January 13, 2019 07:01
Show Gist options
  • Save ttsugriy/1f93921fa8fb46783d4d144f6c4b873b to your computer and use it in GitHub Desktop.
Save ttsugriy/1f93921fa8fb46783d4d144f6c4b873b to your computer and use it in GitHub Desktop.
class Solution:
VALID_VALUES = set(map(str, range(1, 10)))
def solveSudoku(self, board):
"""
:type board: List[List[str]]
:rtype: void Do not return anything, modify board in-place instead.
"""
def rows(row):
return board[row]
def columns(column):
for row in range(len(board)):
yield board[row][column]
def squares(row, column):
start_row = (row // 3) * 3
start_column = (column // 3) * 3
for row in range(start_row, start_row+3):
for column in range(start_column, start_column+3):
yield board[row][column]
def is_set(value):
return value != '.'
def safe(row, column):
return self.VALID_VALUES - (set(rows(row)) | set(columns(column)) | set(squares(row, column)))
def unset():
for row in range(len(board)):
for column in range(len(board[0])):
if not is_set(board[row][column]):
yield row, column
def solve(pos_idx, positions):
row, column = positions[pos_idx]
for safe_value in safe(row, column):
board[row][column] = safe_value
if pos_idx == len(positions) - 1:
return True
solution = solve(pos_idx+1, positions)
if solution:
return True
board[row][column] = '.'
unset = list(unset())
if not unset:
return # already solved
solve(0, unset)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment