leetcode--37. ぶんすう独

1585 ワード

テーマ:leetcode-37.ぶんすう独
リンク:https://leetcode-cn.com/problems/sudoku-solver/description/
解数独,初期残局用"."空白を表す.以前大学院を受ける時C言語のを書いたことがあって、再帰的に解きます.実参に基づいて変更し、結果を返さないでください.そうすればDFSに戻り値を付けて判断すればいいのですが、解が見つかったらTrueに戻り、遡及しません.
python:
def isRowAndColValid(x, y, field, num):
    for i in range(9):
        if field[x][i] == str(num):
            return False
    for j in range(9):
        if field[j][y] == str(num):
            return False
    return True

def isSquareValid(x, y, field, num):
    row, col = (x // 3) * 3, (y // 3) * 3
    for i in range(row, row + 3):
        for j in range(col, col + 3):
            if field[i][j] == str(num):
                return False
    return True

def getNext(field):
    for x in range(9):
        for y in range(9):
            if field[x][y] == ".":
                return [x, y]
    return []

class Solution:
    def solveSudoku(self, board):
        """
        :type board: List[List[str]]
        :rtype: void Do not return anything, modify board in-place instead.
        """
        def DFS(board):
            next = getNext(board)
            if not next:
                # print(board)
                return True
            for i in range(1, 10):
                if isRowAndColValid(next[0], next[1], board, i) and isSquareValid(next[0], next[1], board, i):
                    board[next[0]][next[1]] = str(i)
                    if DFS(board):
                        return True
                    board[next[0]][next[1]] = "."
        DFS(board)