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

问题描述

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,str(i)):
                board[row][col] = str(i)

                solve()

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

print函数中的solve函数返回已解决的数独板,但未就位进行更改。如何更改功能,以便在原位更改板子?

解决方法

找到解决方案后,在调用堆栈中返回True

尝试以下代码:

board = [
["5","3",".","7","."],["6","1","9","5",[".","8","6",["8","3"],["4","1"],["7","2","6"],"4","5"],"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,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','2','5','8'],['1','7'],['8','3'],['4','1'],['7','6'],['9','4'],['2','5'],['3','9']]