Python中的数独检查器

问题描述 投票:5回答:10

我正在尝试在python中创建数独检查器:

ill_formed = [[5,3,4,6,7,8,9,1,2],
              [6,7,2,1,9,5,3,4,8],
              [1,9,8,3,4,2,5,6,7],
              [8,5,9,7,6,1,4,2,3],
              [4,2,6,8,5,3,7,9],  # <---
              [7,1,3,9,2,4,8,5,6],
              [9,6,1,5,3,7,2,8,4],
              [2,8,7,4,1,9,6,3,5],
              [3,4,5,2,8,6,1,7,9]]
easy = [[2,9,0,0,0,0,0,7,0],
       [3,0,6,0,0,8,4,0,0],
       [8,0,0,0,4,0,0,0,2],
       [0,2,0,0,3,1,0,0,7],
       [0,0,0,0,8,0,0,0,0],
       [1,0,0,9,5,0,0,6,0],
       [7,0,0,0,9,0,0,0,1],
       [0,0,1,2,0,0,3,0,6],
       [0,3,0,0,0,0,0,5,9]]

我希望输入这样的内容-9个列表的列表。零表示用户尚未填写的数字。它们可以在行,列或3x3中多次出现。

def check_sudoku(grid):
if len(grid) == 9:
    numsinrow = 0
    for i in range(9):
        if len(grid[i]) == 9:
            numsinrow += 1
    if numsinrow == 9:
        for i in range(9):
            rowoccurence = [0,0,0,0,0,0,0,0,0,0]
            for j in range(9):
                rowoccurence[grid[i][j]] += 1
                temprow = rowoccurence[1:10]
                if temprow == [1,1,1,1,1,1,1,1,1]:
                    return True
                else:
                    return False
    else:
        return False
else:
    return False

我显然需要检查是否有9x9的列表列表(网格),并且每行,每列和3x3的小方块中没有重复项。在代码中,我首先检查是否有适当的行数(应为9)。然后,我检查每行中是否有9个元素(使用ill_formed示例,您会发现情况并非如此)。然后,我尝试检查每一行中的重复项,但是这样做有些麻烦。我以为我可以遍历每一行并遍历该行中的每个元素,然后将1加到一个int列表中(rowoccurence)。例如,如果第一个数字为2,则rowoccurence [2]应等于1。零在rowoccurence [0]中且未选中(我有一个临时列表,该列表应包含除第一个元素以外的所有内容,即-零-因为连续可能会有多个1个零,并且网格仍然是合法的)。我尝试对照正确值的引用列表检查临时列表(基本上是行出现),但它似乎不起作用。您能帮我在此数独检查器中检查重复的行吗?提前非常感谢您!

python sudoku
10个回答
12
投票

[请记住,您不是在寻找重复项-只是非零重复项。汇总一组适用于此。您还可以同时检查行/列的合法性:



4
投票

return True太早了,所以您永远都无法参加希望看到失败的测试:


1
投票

定义一个函数以确认没有重复项,然后可以使用它检查行,列和3x3网格。您可以通过在不满足某些条件的情况下尽早返回来减少嵌套块,例如,行数大于9。并且仅在函数末尾返回true,如果所有检查均未通过。


1
投票

我之所以这样发表,是因为大多数其他解决方案虽然可能确实有效,但却很难阅读。对于刚开始学习的新手,我相信下面的代码很有帮助,而且可读性强。希望这对希望学习如何创建数独检查程序的人有所帮助。


0
投票

仅使用以下命令检查每一行/列如何?


0
投票

我认为您的代码崩溃的原因是您的缩进。您应该这样做:


0
投票
def check_sudoku(grid):
if len(grid) == 9:
    numsinrow = 0
    for i in range(9):
        if len(grid[i]) == 9:
            numsinrow += 1
    if numsinrow == 9:
        if checkrow(grid):
            if checkcol(grid):
                return True
            else:
                return False
        else:
            return False
    else:
        return False
else:
    return False

def checkrow(grid):
    for i in range(9):
        rowoccurence = [0,0,0,0,0,0,0,0,0,0]
        for j in range(9):
            rowoccurence[grid[i][j]] += 1
        temprow = rowoccurence[1:10]
        for q in range(9):
            if temprow[q] == 1 or temprow[q] == 0:
                continue
            else:
                return False
    return True

def checkcol(grid):
    for num in range(9):
        coloccurence = [0,0,0,0,0,0,0,0,0,0]
        for i in range(9):
            coloccurence[grid[i][num]] += 1
        tempcol = coloccurence[1:10]
        for q in range(9):
            if tempcol[q] == 1 or tempcol[q] == 0:
                continue
            else:
                return False
    return True

0
投票

如果要检查一行是否有重复,而不是


0
投票

编写了一个简单的类来为(完成的)数独板建模。 9x9电路板的简单解决方案不过是棘手的。

© www.soinside.com 2019 - 2024. All rights reserved.