Python中的Sudoku Solver

时间:2014-04-22 01:58:14

标签: python sudoku

所以,我正在尝试创建一个函数,它将包含一个列表列表,每个列表包含9个编号为1到9的整数,如果它是数独的有效解,则返回一个布尔值。现在,我已经设法通过检查行和列来解决部分问题,但我坚持执行检查三到三个框。到目前为止,这是我的代码。

alist = [1,2,3,4,5,6,7,8,9]

def checkSudoku(grid):
    a = grid
    b = grid
    c = grid
    d = False
    e = False
    f = False
    newlist = []
    for i in a:
        i.sort()
        if i == alist:
            d = True
        else:
            d = False
            break
    for j in range(9):
        for k in b:
            newlist.append(k)

        newlist.sort()
        if i == alist:
            e = True
            newlist = []
        else:
            e = False
            break

    if d == True and e == True:
        return True
    else:
        return False

基本上,我要测试所有必要的三个因素才真实,然后如果所有三个都是True则返回True,否则返回false。有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

不确定这是否是您的问题,但此代码存在一个非常明显的问题:

a = grid
b = grid
c = grid

看起来你认为这会创建3个网格副本,但事实并非如此。它为同一个对象创建三个不同的引用。这意味着i.sort()上的a将影响b之后的逻辑。

您应该做的是实际复制对象。这是一个嵌套列表使这有点棘手,但一个简单的方法是使用库函数deepcopy:

a = copy.deepcopy(grid)
b = copy.deepcopy(grid)
c = copy.deepcopy(grid)

答案 1 :(得分:1)

代码工作方式的一个主要问题是您使用的是list.sort,这意味着网格本身会发生变化。考虑使用sorted,它适用于所有迭代,并返回一个副本:

for row in grid:
    if sorted(row) == alist:
        # now you know that the row contains all ints 1-9.

这也意味着您无需尝试手动复制grid。如果您需要帮助重复list(特别是多维list),请查看this question

至于检查每个3x3盒子:首先迭代9个“左上角”的每个角落:

for x in (0,3,6):
    for y in (0,3,6):
        subgrid = grid[y][x:x+3] + grid[y+1][x:x+3] + grid[y+2][x:x+3]
        if sorted(subgrid) == alist:
            # do your thing

有关列表切片的帮助,请检查this out

相关问题