【问题标题】:Sudoku Solver function does not return correctlySudoku Solver 函数无法正确返回
【发布时间】:2021-03-24 17:37:33
【问题描述】:

我正在研究一个 Leetcode 问题,其中实现了对字符串列表进行操作的数独求解器,返回相同格式的已求解板。我遇到了一个问题,如果我添加一个打印语句,该函数将打印已解决的板,但是当我尝试在同一点返回板时,它返回 None。

def row_legal(board,i,j,k):
    row = board[i]
    if row.count(str(k))>0:
        return False
    return True

def box_legal(board,i,j,k):
    row_num = i//3
    col_num = j//3
    box = [board[3*row_num+p][3*col_num+q] for p in range(3) for q in range(3)]
    if box.count(str(k))>0:
        return False
    return True

def col_legal(board,i,j,k):
    col = [board[l][j] for l in range(9)]
    if col.count(str(k))>0:
        return False
    return True

def is_available(board,i,j,n):
    return col_legal(board,i,j,n) and box_legal(board,i,j,n) and row_legal(board,i,j,n)
def solver(board):
    for i in range(9):
        for j in range(9):
            if board[i][j]=='.':#recursion & backtracking section#
                for k in range(1,10):
                    if is_available(board,i,j,k):
                        board[i][j]=str(k)
                        solver(board)
                        board[i][j]='.'
                return
    return board

如果solver 的最后一行被替换为print(board),则会打印一个解决方案。但是,返回输出None 或者如果上面的返回返回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"]]

【问题讨论】:

  • “为什么它不能返回一个?”——是什么让你认为它不能?请阅读How to Ask
  • 你从哪里调用求解器?我认为问题不在于这段代码,而在于最初调用求解器的代码。代码应该返回,但您要将解决方案返回到哪里?
  • 代码不会返回板句号,目前我一直在 jupyter notebook 中以一行方式运行它:```solver(board) ```
  • 如果你要返回一个你需要打印的值(solver(board))
  • 如果函数返回任何东西,Jupyter notebook 会打印返回的对象,

标签: python python-3.x recursion sudoku


【解决方案1】:

分辨率: solver 函数在找到解决方案时不会放弃解决方案(即它继续在每个单元格中尝试不同的值等),下面列出了一个简单的修复:

def solver(board):
    for i in range(9):
        for j in range(9):
            if board[i][j]=='.':#recursion & backtracking section#
                for k in range(1,10):
                    if is_available(board,i,j,k):
                        board[i][j]=str(k)
                        if solver(board):
                            return board   
                        board[i][j]='.'
                return
    return board

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2017-12-07
    • 2016-01-03
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多