스도쿠 솔버

3028 단어 leetcodetheabbiedsa
빈 칸을 채워서 스도쿠 퍼즐을 푸는 프로그램을 작성하세요.

스도쿠 솔루션은 다음 규칙을 모두 충족해야 합니다.
  • 각 숫자1-9는 각 행에서 정확히 한 번씩 나타나야 합니다.
  • 각 숫자1-9는 각 열에서 정확히 한 번씩 나타나야 합니다.
  • 각 숫자1-9는 그리드의 각 9개3x3 하위 상자에서 정확히 한 번씩 나타나야 합니다.
  • '.' 문자는 빈 셀을 나타냅니다.

    예 1:



    입력: 보드 = [["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"]]
    출력: [["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"]]
    설명: 입력 보드는 위에 표시되어 있고 유일한 유효한 솔루션은 아래에 표시되어 있습니다.



    제약:
  • board.length == 9
  • board[i].length == 9
  • board[i][j]는 숫자 또는 '.'입니다.
  • 입력 보드에 하나의 솔루션만 있음이 보장됩니다.

  • 해결책:

    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: List[List[str]]) -> None:
            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)
    

    좋은 웹페이지 즐겨찾기