Skip to content

Instantly share code, notes, and snippets.

@theabbie
Last active May 6, 2022 15:13
Show Gist options
  • Save theabbie/4c660ca0a9a9335dc3143a4c0f169464 to your computer and use it in GitHub Desktop.
Save theabbie/4c660ca0a9a9335dc3143a4c0f169464 to your computer and use it in GitHub Desktop.
Sudoku Solver
class Solution:
def getPos(self, board, i, j):
pos = set(map(str, range(1, 10)))
ci, cj = i - i % 3, j - j % 3
for a in range(3):
for b in range(3):
if board[ci + a][cj + b] != "." and board[ci + a][cj + b] in pos:
pos.remove(board[ci + a][cj + b])
for a in range(9):
if board[i][a] in pos:
pos.remove(board[i][a])
if board[a][j] in pos:
pos.remove(board[a][j])
return pos
def solve(self, board, spi):
if spi >= len(self.spaces):
return True
if spi < len(self.spaces):
i, j = self.spaces[spi]
pos = self.getPos(board, i, j)
for p in pos:
board[i][j] = p
currsolution = self.solve(board, spi + 1)
if currsolution:
return True
else:
board[i][j] = "."
return False
def solveSudoku(self, board):
self.spaces = []
for i in range(9):
for j in range(9):
if board[i][j] == ".":
self.spaces.append((i, j))
self.solve(board, 0)
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"],
]
Solution().solveSudoku(board)
print("\n".join([" ".join(row) for row in board]))
# OUTPUT
# 5 3 4 6 7 8 9 1 2
# 6 7 2 1 9 5 3 4 8
# 1 9 8 3 4 2 5 6 7
# 8 5 9 7 6 1 4 2 3
# 4 2 6 8 5 3 7 9 1
# 7 1 3 9 2 4 8 5 6
# 9 6 1 5 3 7 2 8 4
# 2 8 7 4 1 9 6 3 5
# 3 4 5 2 8 6 1 7 9
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment