我的数独查找器有什么问题?

时间:2019-10-01 16:22:56

标签: python sudoku

对于代码信号,我已经提交了sudoku2问题的解决方案。但是,这适用于所有测试用例,除了其中一个数字在拼图中间的3 x 3块中重复并且该函数返回true而不是false的情况下。

程序应首先使用checkRows和checkColumns检查所有行和列是否具有不同的数字。然后,它对每个3×3的数字块重复check3by3。每次检查该块时,将每列迭代3次,然后在列达到其极限时针对行迭代3次。 check3by3函数为该块中已有的数字创建一个集合,如果不重复,则将数字添加到该集合中。如果重复该数字,则该数字将位于集合中,并且该函数将返回false。

def sudoku2(grid):
    if checkRows(grid) and checkColumns(grid):
        for i in range(0,len(grid),3):
            for j in range(0,len(grid),3):
                if check3by3(grid , i + 3, j + 3):
                    return True

    return False

def checkRows(puzzle):
    for list in puzzle:
        s = set()
        for item in list:

            if item in s:
                return False

            elif item == '.':
                pass

            else:
                s.add(item)

    return True


def checkColumns(puzzle):
    for i in range(len(puzzle)):
        s2 = set()
        for j in range(len(puzzle)):
            if puzzle[j][i] in s2:
                return False
            elif puzzle[j][i]  == '.':
                pass
            else:
                s2.add(puzzle[j][i])

    return True

def check3by3(puzzle , row , column):
    set3 = set()
    for i in range(row):
        for j in range(column):
            if puzzle[i][j] in set3:
                return False
            elif puzzle[i][j] == '.':
                pass
            else:
                set3.add(puzzle[i][j])

    return True

我该如何解决该问题?

1 个答案:

答案 0 :(得分:0)

您的主要问题是,您试图在check3by3()循环内运行for函数3次,但是在第一次调用返回True之后,您将从sudoku2()函数返回。您甚至都没有到达3x3网格的第二排或第三排。我建议从check3by3检查一个False返回值,并让sudoku2()仅在循环中一直运行的情况下才返回True

一旦解决了此问题,下一个问题就是range()函数中的check3by3()问题。如果您仅向range()提供一个参数,它将检查从0到您传递的每个值。因此,在您的第一个循环中,您将其传递给range(3),因为您想检查第0、1和2行,所以它可以正常工作。但是,一旦到达下一行网格,您将调用{{ 1}},您将在其中检查0-5的所有行。

您需要在这里做的是,不要将3添加到range(6)调用中,只需传递未修改的行号和列号,然后不要调用check3by3range(row)想呼叫range(column)range(row, row+3)。这样,当您检查3x3块的第二行时,将遍历range(column, column+3)(3,4,5)而不是range(3, 6)(0,1,2,... 5)< / p>

我不能保证您以后不会再遇到更多问题;我对整个程序的了解不尽如人意,但这应该为您解决当前问题提供了正确的途径。