【问题标题】:Sudoku Solver in PythonPython中的数独求解器
【发布时间】:2014-06-06 04:59:06
【问题描述】:

因此,我正在尝试创建一个函数,该函数将接收一个列表列表,每个列表由编号为 1 到 9 的 9 个整数组成,如果它是数独的有效解决方案,则返回一个布尔值。现在,我已经设法解决了检查行和列的部分问题,但是我坚持检查三个三个框的实现。到目前为止,这是我的代码。

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

def checkSudoku(grid):
    a = grid
    b = grid
    c = grid
    d = False
    e = False
    f = False
    newlist = []
    for i in a:
        i.sort()
        if i == alist:
            d = True
        else:
            d = False
            break
    for j in range(9):
        for k in b:
            newlist.append(k)

        newlist.sort()
        if i == alist:
            e = True
            newlist = []
        else:
            e = False
            break

    if d == True and e == True:
        return True
    else:
        return False

基本上,My 是测试它为真所必需的所有三个因素,然后如果三个都为真则返回 True,否则返回假。有什么帮助吗?

【问题讨论】:

  • 好消息:有人已经解决了这个确切的问题。 norvig.com/sudoku.html
  • 改进代码的建议:使用更好的变量名。如果不深入研究一堆代码,我无法完全了解您的 af 变量的含义。如果他们有有意义的名字,我可能会立即看到问题。单字母变量名称通常很糟糕,除非在非常有限的情况下(ij 通常是循环中的传统索引变量,xyz 具有悠久的数学传统作为坐标名称等) .
  • 任何时候你将一个变量设置为False,你可能只是返回False。您可能也有兴趣查看set 课程。
  • @emodendroket 如果这个问题已经在 Stack Overflow 的其他地方得到解决,那么这可能会被标记为重复。但是,提出已在外部回答的问题并没有错。
  • @SimonT 这并不是批评。发布问题的非现场解决方案的链接有什么问题吗?

标签: python sudoku


【解决方案1】:

不确定这是否是您的问题,但这段代码有一个非常明显的问题:

a = grid
b = grid
c = grid

您似乎认为这会创建 3 个网格副本,但事实并非如此。它为同一个对象创建了三个不同的引用。这意味着您在a 上的i.sort() 将影响稍后在b 上的逻辑。

你应该做的是实际复制对象。它是一个嵌套列表,这有点棘手,但一个简单的方法是使用库函数 deepcopy:

a = copy.deepcopy(grid)
b = copy.deepcopy(grid)
c = copy.deepcopy(grid)

【讨论】:

  • 一个更简单的解决方法可能是在您对子列表进行排序时使用sorted 函数进行复制。那么根本不需要多个网格副本!
【解决方案2】:

代码工作方式的一个主要问题是您使用的是list.sort,这意味着网格本身会发生变化。考虑使用sorted,它适用于所有可迭代对象并返回一个副本:

for row in grid:
    if sorted(row) == alist:
        # now you know that the row contains all ints 1-9.

这也意味着您无需尝试手动复制grid。如果您在复制list(尤其是多维list)时需要帮助,请查看this question

至于检查每个 3x3 框:首先像这样遍历 9 个“左上角”中的每一个:

for x in (0,3,6):
    for y in (0,3,6):
        subgrid = grid[y][x:x+3] + grid[y+1][x:x+3] + grid[y+2][x:x+3]
        if sorted(subgrid) == alist:
            # do your thing

有关列表切片的帮助,请查看this out

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多