对于代码信号,我已经提交了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
我该如何解决该问题?
答案 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)
调用中,只需传递未修改的行号和列号,然后不要调用check3by3
和range(row)
想呼叫range(column)
和range(row, row+3)
。这样,当您检查3x3块的第二行时,将遍历range(column, column+3)
(3,4,5)而不是range(3, 6)
(0,1,2,... 5)< / p>
我不能保证您以后不会再遇到更多问题;我对整个程序的了解不尽如人意,但这应该为您解决当前问题提供了正确的途径。