Python中的数独谜题

时间:2016-11-08 06:48:11

标签: python sudoku

我是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

2 个答案:

答案 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 aFalse,因为[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 提到了其他一些改进措施。

但是,由于缺少网格检查,数独检查程序的逻辑仍然是错误的。检查行级别和列级别的唯一性是必要条件,但这还不够。请考虑以下示例:

enter image description here enter image description here

enter image description here enter image description here

正如您在上图所示,每行都有唯一的元素,每列都有独特的元素,但每个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
相关问题