在递归数独求解器中传递矩阵

时间:2014-10-08 18:23:30

标签: python function recursion matrix sudoku

所以我很久以前在C中写过一个蛮力的数独求解器。我认为在Python中使用它也会很好,所以我只是翻译了我的逻辑(用于检查值是否可以合法放置在(x,y)的函数以及一个以递归方式找到所有解法的函数) )。其他所有东西(主要是i / o)我都可以用单行替换(对于Python来说很好)。

问题是,代码不起作用。 " SUD"是一个9x9矩阵(在开头)包含未解决的数独。未知数字由零表示。

程序似乎没有改变存储在" sud"中的值,所以我猜测问题在于我的矩阵定义的范围?在C中我定义了" sud"作为外部,我如何在Python中执行此操作?或者我是否需要将矩阵作为参数传递给我的函数?

很抱歉,如果我的问题看起来微不足道,我对Python很陌生。

以下是我目前的代码:

N = 9
f = open('sudoku.txt', 'r')
tmp = f.read().splitlines()
sud = [[int(x) for x in tmp[i]] for i in range(N)]

def check(x, y, val):
    if val in [i for i in sud[y]]:                  ### check row x for val
       return 1
    if val in [sud[i][x] for i in range(N)]:        ### check column y for val
       return 1
    xbox = int(x/3) * 3
    ybox = int(y/3) * 3
    for i in range(xbox, xbox+3):
        for j in range(ybox, ybox+3):
            if val == sud[i][j]:                    ### check box for val
                return 1
    return 0

def solve(x = 0, y = 0):
    if x == N:
        y += 1
        x = 0
        if y == N:
            return 1
    if sud[y][x] > 0:
        return solve(x + 1, y)
    for i in range(1, N+1):
        if not check(x, y, i):
            sud[y][x] = i
            if solve(x + 1, y):
                print(sud)
    sud[y][x] = 0
    return 0

1 个答案:

答案 0 :(得分:3)

for i in range(xbox, xbox+3):
    for j in range(ybox, ybox+3):
        if val == sud[i][j]:                    ### check box for val
            return 1

您似乎在if行混淆了x和y索引;在你的其余代码中,y首先出现,x出现在第二个。

for i in range(xbox, xbox+3):
    for j in range(ybox, ybox+3):
        if val == sud[j][i]:                    ### check box for val
            return 1

Testing this针对Wug友好提供的示例网格,产生的输出似乎是正确的。