【问题标题】:Why does my Sudoku solver return an empty sudoky grid?为什么我的数独求解器返回一个空的数独网格?
【发布时间】:2021-01-08 13:05:11
【问题描述】:

我正在尝试在 Python 中创建自己的数独求解器,但它返回一个空的数独网格。

我尝试在 pythontutor 上可视化我的代码,以便我可以看到问题所在,但第一行的数字是正确的。

所以我不知道为什么它返回一个空网格。通过空网格,我的意思是它返回与开始完全相同的网格。 0 不会被数字替换。

这是我的代码:

board = [
        [7, 8, 0, 4, 0, 0, 1, 2, 0],
        [6, 0, 0, 0, 7, 5, 0, 0, 9],
        [0, 0, 0, 6, 0, 1, 0, 7, 8],
        [0, 0, 7, 0, 4, 0, 2, 6, 0],
        [0, 0, 1, 0, 5, 0, 9, 3, 0],
        [9, 0, 4, 0, 6, 0, 0, 0, 5],
        [0, 7, 0, 3, 0, 0, 0, 1, 2],
        [1, 2, 0, 0, 0, 7, 4, 0, 0],
        [0, 4, 9, 2, 0, 6, 0, 0, 7]
    ]

def valid(row, col, number):
    global board
    for i in range(0,9):
        if board[row][i]==number:
            return False
    
    for i in range(0,9):
        if board[i][col]==number:
            return False
    
    col_start = (col//3)*3
    row_start = (row//3)*3 

    for r in range(0, 3):
        for c in range(0, 3):
            if board[row_start+r][col_start+c]==number:
                return False
    return True

def solve_sudoku():
    global board
    for row in range(9):
        for col in range(9):
            if board[row][col]==0:
                for number in range(1,10):
                    if valid(row, col, number):
                        board[row][col] = number
                        solve_sudoku()
                        board[row][col] = 0
                return False


print(board)
solve_sudoku()
print(board)

【问题讨论】:

  • 什么是“空网格”?
  • 通过空网格,我的意思是所有的0都没有被数字代替。我要编辑得更精确
  • 嗯嗯,我真的对数独一无所知,但是你的 solve_sudoku 函数会检查一个数字是否为零,if board[row][col] == 0: 然后你把它改成一个数字:board[row][col] = number 然后 在那之后你把它变回零board[row][col] = 0
  • if board[row][col] == 0: 用于回溯。这意味着如果一个案例上没有正确的数字,它将返回到前一个案例。我的意思是也许我错了,因为我仍在努力理解递归性和回溯。但我确定第一行已经成功完成,我不知道它为什么返回输入网格。
  • 我已经向您解释过,您对全局 board 对象所做的任何更改都会被撤销。想想看。您告诉它更改为某个数字,然后立即告诉它更改回0。相反,不要依赖于改变全局板对象。例如,将 board 作为参数传递,当您进行递归调用时,传递 board 的副本。

标签: python sudoku


【解决方案1】:

你的回报是你认为的空网格,你把board[row][col] = 0放在def solve_sudoku():

                    if valid(row, col, number):
                        board[row][col] = number
                        solve_sudoku()
                        board[row][col] = 0

所以递归操作后值再次设置为零。

正在寻找您的下一次试用。

祝你好运。

【讨论】:

  • 感谢您的反馈。
【解决方案2】:

如果您不介意一些编码约定反馈:

valid() 使用 range(0, N) 而solve_sodoku() 使用 range(N)。它们是等价的。 最好保持一致。后者更可取,因为它比较稀疏。

过多使用硬编码数字“9”。你应该更喜欢 len(board)。或者设置一个常数 像:matrix_size = 9 并在整个过程中引用 matrix_size。从生产的角度思考 仅通过更改初始矩阵即可支持 8x8 板矩阵的代码集。

for number in range(1,10) 有效,但与其余代码脱节。 我建议你试试:

for i in range(len(board)):
    number = i + 1
    if valid(col, row, number)

【讨论】:

  • 感谢您的反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 2017-11-07
  • 2014-02-07
  • 1970-01-01
相关资源
最近更新 更多