Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法使用回溯获取数独解算器的输出_Python_Python 3.x_Recursion_Sudoku_Recursive Backtracking - Fatal编程技术网

Python 无法使用回溯获取数独解算器的输出

Python 无法使用回溯获取数独解算器的输出,python,python-3.x,recursion,sudoku,recursive-backtracking,Python,Python 3.x,Recursion,Sudoku,Recursive Backtracking,我开始使用回溯和递归来研究数独解算器。我无法打印已解决的数独。我已经测试了可能的(y,x,n)方法,它很有效。程序以结束,进程以退出代码0结束,但不打印已解决的数独难题。我正在使用python 3.7和PyCharm Community Edition 2020.1.3作为我的IDE import numpy as np grid = [[5, 3, 0, 0, 7, 0, 0, 0, 0], [6, 0, 0, 1, 5, 9, 0, 0, 0], [0, 9

我开始使用回溯和递归来研究数独解算器。我无法打印已解决的数独。我已经测试了
可能的(y,x,n)
方法,它很有效。程序以
结束,进程以退出代码0结束,但不打印已解决的数独难题。我正在使用python 3.7和PyCharm Community Edition 2020.1.3作为我的IDE

import numpy as np

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


def possible(y, x, n):
    global grid
    for i in range(9):
        if grid[y][i] == n:
            return False
    for i in range(9):
        if grid[x][i] == n:
            return False
    x0 = (x // 3) * 3
    y0 = (y // 3) * 3
    for i in range(3):
        for j in range(3):
            if grid[y0 + i][x0 + j] == n:
                return False
    return True


def solve():
    global grid
    for y in range(9):
        for x in range(9):
            if grid[y][x] == 0:
                for n in range(1, 10):
                    if possible(y, x, n):
                        grid[y][x] = n
                        solve()
                        grid[y][x] = 0
                return
    print(np.matrix(grid))


if __name__ == "__main__":
    solve()
我已经测试了可能的(y,x,n)方法,它是有效的

但它坏了:

if grid[x][i] == n:
应该是:

if grid[i][x] == n:
下一个问题是你试图解决的难题,它被破解了!第六列有两个9:

[., ., ., ., ., 0, ., ., .]
[., ., ., ., ., 9, ., ., .]
[., ., ., ., ., 0, ., ., .]
[., ., ., ., ., 0, ., ., .]
[., ., ., ., ., 3, ., ., .]
[., ., ., ., ., 0, ., ., .]
[., ., ., ., ., 0, ., ., .]
[., ., ., ., ., 9, ., ., .]
[., ., ., ., ., 0, ., ., .]
您可能希望向函数集添加一个谜题验证器。在我下面的例子中,我使用了一个不同的可以解决的难题,否则很难调试代码

最后,您的
solve()
函数将得到授权。它不应该打印谜题,而是返回一个布尔值,指示它是否解决了谜题。这个结果然后用于回溯,并在最后确定该谜题是否可解

最后,请仔细阅读
global
关键字,您没有正确使用它

import numpy as np

def possible(y, x, n):
    for i in range(9):
        if grid[y][i] == n:
            return False

    for i in range(9):
        if grid[i][x] == n:
            return False

    x0 = (x // 3) * 3
    y0 = (y // 3) * 3

    for i in range(3):
        for j in range(3):
            if grid[y0 + i][x0 + j] == n:
                return False

    return True

def solve():
    for y in range(9):
        for x in range(9):
            if grid[y][x] == 0:
                for n in range(1, 10):
                    if possible(y, x, n):
                        grid[y][x] = n  # tentatively try n

                        solved = solve()
                        if solved:
                            return True  # solved recursively!

                        grid[y][x] = 0  # undo attempt at n
                
                return False  # no solution for this square

    return True  # no 0's to resolve, puzzle solved!

if __name__ == "__main__":
    grid = [
        [6, 5, 8, 0, 0, 0, 0, 7, 0],
        [0, 7, 0, 0, 5, 0, 8, 0, 0],
        [0, 3, 9, 0, 0, 0, 5, 4, 0],
        [0, 0, 2, 6, 0, 5, 0, 0, 7],
        [0, 6, 0, 9, 7, 4, 0, 0, 0],
        [7, 0, 0, 3, 0, 0, 6, 0, 0],
        [0, 4, 6, 0, 0, 0, 2, 5, 0],
        [0, 0, 7, 0, 6, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 7, 6, 8]
    ]

    if solve():
        print(np.matrix(grid))
    else:
        print("No solution!")
输出

> python3 test.py
[[6 5 8 1 4 3 9 7 2]
 [4 7 1 2 5 9 8 3 6]
 [2 3 9 7 8 6 5 4 1]
 [3 9 2 6 1 5 4 8 7]
 [8 6 5 9 7 4 1 2 3]
 [7 1 4 3 2 8 6 9 5]
 [1 4 6 8 3 7 2 5 9]
 [9 8 7 5 6 2 3 1 4]
 [5 2 3 4 9 1 7 6 8]]
> 

solve()
函数中有一个早期的
return
语句,这就是为什么行
print(np.matrix(grid))
不运行的原因。