所以我很久以前在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
答案 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友好提供的示例网格,产生的输出似乎是正确的。