diff --git a/LeetcodeProblems/37. Sudoku Solver b/LeetcodeProblems/37. Sudoku Solver new file mode 100644 index 0000000000..a5bbe9a5d3 --- /dev/null +++ b/LeetcodeProblems/37. Sudoku Solver @@ -0,0 +1,90 @@ +** 37. Sudoku Solver ** + +# Approach 1: +from typing import List + +class Solution: + def solveSudoku(self, board: List[List[str]]) -> bool: + def isValid(row: int, col: int, c: str) -> bool: + return c not in rows[row] and c not in cols[col] and c not in boxes[3 * (row // 3) + (col // 3)] + + def placeNumber(row: int, col: int, c: str): + board[row][col] = c + rows[row].add(c) + cols[col].add(c) + boxes[3 * (row // 3) + (col // 3)].add(c) + + def removeNumber(row: int, col: int, c: str): + board[row][col] = "." + rows[row].remove(c) + cols[col].remove(c) + boxes[3 * (row // 3) + (col // 3)].remove(c) + + def backtrack(index: int) -> bool: + if index == len(empty_cells): + return True + + row, col = empty_cells[index] + for c in "123456789": + if isValid(row, col, c): + placeNumber(row, col, c) + if backtrack(index + 1): + return True + removeNumber(row, col, c) + return False + + rows = [set() for _ in range(9)] + cols = [set() for _ in range(9)] + boxes = [set() for _ in range(9)] + + empty_cells = [] + + for r in range(9): + for c in range(9): + if board[r][c] == ".": + empty_cells.append((r, c)) + else: + placeNumber(r, c, board[r][c]) + + empty_cells.sort(key=lambda cell: sum(1 for c in "123456789" if isValid(cell[0], cell[1], c))) + + backtrack(0) + +# Approach 2: +class Solution: + def solveSudoku(self, board: List[List[str]]) -> None: + n = 9 + def isValid(row, col, ch): + row, col = int(row), int(col) + + for i in range(9): + + if board[i][col] == ch: + return False + if board[row][i] == ch: + return False + + if board[3*(row//3) + i//3][3*(col//3) + i%3] == ch: + return False + + return True + + def solve(row, col): + if row == n: + return True + if col == n: + return solve(row+1, 0) + + if board[row][col] == ".": + for i in range(1, 10): + if isValid(row, col, str(i)): + board[row][col] = str(i) + + if solve(row, col + 1): + return True + else: + board[row][col] = "." + return False + else: + return solve(row, col + 1) + solve(0, 0)