Python数独求解器

时间:2018-09-23 07:29:08

标签: python

尝试创建自己的数独求解器。

我将0用作空白

求解器几乎完成了,但是有时它不能替换0。这是什么问题?

def sud(nums):

    for row in nums:
        for n in row:
            if n == 0:
                under = [u_row[row.index(n)] for u_row in sudoku]
                for i in range(1, 10):
                    if i not in row and i not in under:
                        row[row.index(n)] = i

    return nums

此处的数字是带有数独的列表,例如:

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

这是此列表的输出:

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

1 个答案:

答案 0 :(得分:3)

您的实现存在缺陷。您正在做的是,将不在行或列中的第一个数字放在该位置。但这并非总是如此。可能有多个这样的数字。

例如,在您的数独输入中,第一个元素的初始值可以为2、3、6和8。

您需要做的是,如果最终电路板上仍包含零,则回溯到先前的状态并尝试放置另一个数字,然后对该状态进行递归求解。

了解有关Backtracking here.

的信息