我是python和StackOverflow的新手,并尝试编写一个小程序来检查数独谜题(即一系列列表)是正确的(True)还是不正确的(False)。
所以我通过编写2个函数来分解它,一个检查ROWS(即检查每个列表中是否存在1-n中的一个EACH编号 - ,其中n是列表的长度)一个检查COLUMNS的函数(以确保列表中没有元素交叉,并且在0,1,1等位置只有1-n中的每个数字中的一个)。
第一个功能正常,但第二个功能(检查列)似乎不断输出' True'即使拼图不正确。例如,对于列表
myList =
[[1,2,3],
[3,1,2],
[3,2,3]],当拼图错误时,输出为True。我已经尝试通过逐行检索问题多次发现问题,但无济于事!任何人都可以发现我做错了什么,或者分享编码数独检查器的更好方法吗? :)
谢谢!!这是我检查列的代码:
def check_down(list_of_lists):
a = [] #checking list
i = -1 #list
j = 0 #position
n = len(list_of_lists)
while True:
i = i + 1
if [list_of_lists[i][j]] in a: #if list element already in a, it is a copy so False
return False
break
elif [list_of_lists[i][j]] not in a:
a = a + [list_of_lists[i][j]] #if list element not in a then add it
if i == n-1 and j == n-1: #if loop reaches end of lists, True
return True
break
elif i == n-1 and j!= n-1: #if last list but not last position, move on
j = j +1 #next position to check
i = -1 #reset i to -1
del a[:] #empty the checking list
else:
return False
答案 0 :(得分:1)
首先,你的流量确实是错误的。
你真的不应该写像
这样的东西while True :
i = i + 1
即使while
的内部应该在某个地方破坏。相反,由于您正在遍历行,只需执行:
while i < rowsNumber :
i = i + 1
然后,你写道:
if A :
#stuff
elif not A :
#other stuff
else :
#guess what, stuff
但最后else
无法在逻辑上达成。正确的方法是:
if A :
#stuff
else :
#other stuff
此外,你写a = a + [list_of_lists[i][j]]
,它确实有用,但我更喜欢a.append(list_of_list[i][j]
,这更像是pythonic。
此外,您不需要在break
语句后使用return
,因为return
会停止执行该功能。
现在针对您的问题:您写了[list_of_lists[i][j]] in a
,False
,因为[list_of_lists[i][j]]
是一个列表。你想要的是[list_of_lists[i][j]] in a
,没有括号。
我更正了这一点并在您的示例中尝试了它,它确实返回了False
。
答案 1 :(得分:0)
您的代码中的问题是您正在检查列表a 中是否存在列表,而不是检查该数字是否存在:
if [list_of_lists[i][j]] in a:
因此 list_of_lists [i] [j] 周围的括号使其成为包含单个元素的列表。因此,您需要移除这些括号,代码将按预期工作。
@Right Leg 提到了其他一些改进措施。
但是,由于缺少网格检查,数独检查程序的逻辑仍然是错误的。检查行级别和列级别的唯一性是必要条件,但这还不够。请考虑以下示例:
正如您在上图所示,每行都有唯一的元素,每列都有独特的元素,但每个3x3网格中都有重复的元素。因此,即使答案 False ,您的解决方案也会返回 True ,因为您没有任何网格检查。因此,您还需要编写逻辑来检查网格级别的唯一性。
您可以使用以下代码。请注意,可以使用额外的空间来改进以下代码:
import math
def checkSudoku(sudoku):
# Check uniqueness in each row.
for i in range(len(sudoku)):
lst = []
for j in range(len(sudoku)):
if sudoku[i][j] in lst:
return False
else:
lst.append(sudoku[i][j])
# Check uniqueness in each column.
for j in range(len(sudoku)):
lst =[]
for i in range(len(sudoku)):
if sudoku[i][j] in lst:
return False
else:
lst.append(sudoku[i][j])
# Check uniqueness in each grid.
offset = int(math.sqrt(len(sudoku)))
for rowStart in range(0,len(sudoku),offset):
rowEnd = rowStart + offset
for columnStart in range(0,len(sudoku),offset):
columnEnd = columnStart + offset
lst = []
for i in range(rowStart,rowEnd):
for j in range(columnStart,columnEnd):
if sudoku[i][j] in lst:
return False
else:
lst.append(sudoku[i][j])
# No test was failed, So return True.
return True