如何在 class 方法中就地更改列表元素

How to change the list element inplace in a class method

Sudoku Solver

这里我想就地解决给定的数独问题

class Solution:
def solveSudoku(self, board: List[List[str]]) -> None:
    """
    Do not return anything, modify board in-place instead.
    """
    def is_correct(row, col, num):
        #column
        for c in range(9):
            if board[row][c] == num:
                return False

        #row
        for r in range(9):
            if board[r][col] == num:
                return False

        #square
        x = row//3 * 3
        y = col//3 * 3
        for i in range(3):
            for j in range(3):
                if board[x+i][y+j] == num:
                    return False
        return True

    def find_next():
        
        for i in range(9):
            for j in range(9):
                if board[i][j] == '.':
                    return i, j
        return None, None

    def solve():
        row, col = find_next()

        if row == None:
            print(board)
            return True
    

        for i in range(1, 10):
            if is_correct(row, col, str(i)):
                board[row][col] = str(i)

                solve()

            board[row][col] = '.'
    
    solve()

solve 函数中的 print 函数 returns 解决了数独板,但它没有就地更改它。我怎样才能改变功能,以便我就地改变电路板?

找到解决方案后,return True调用堆栈。

试试这个代码:

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"]]

class Solution:
   def solveSudoku(self, board) -> None:
     """
     Do not return anything, modify board in-place instead.
     """
     solve()
    
def is_correct(row, col, num):
    #column
    for c in range(9):
        if board[row][c] == num:
            return False

    #row
    for r in range(9):
        if board[r][col] == num:
            return False

    #square
    x = row//3 * 3
    y = col//3 * 3
    for i in range(3):
        for j in range(3):
            if board[x+i][y+j] == num:
                return False
    return True

def find_next():
    
    for i in range(9):
        for j in range(9):
            if board[i][j] == '.':
                return i, j
    return None, None

def solve():
    #print(id(board))
    row, col = find_next()

    if row == None:
        #print(board)
        return True


    for i in range(1, 10):
        if is_correct(row, col, str(i)):
            board[row][col] = str(i)

            if solve(): return True  # solution found
            board[row][col] = '.'  # no solution yet

Solution().solveSudoku(board)

print(board)  # global board

输出

[['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']]