2014-10-08 2 views
1

Итак, я написал грубую силовую решатель в C некоторое время назад. Я подумал, что было бы неплохо иметь его и на Python, так что я просто перевел логику, которую я имел (функция для проверки того, может ли значение быть законно помещено в (x, y) и одно, которое находит все решения рекурсивно). Все остальное (в основном я/я) я смог заменить одним словом (ура для Python).Проходящая матрица в рекурсивном решателе sudoku

Проблема в том, что код не работает. «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

Что такое тип sud? как он определяется? –

+0

Я добавил его к описанию. – mrbaozi

+1

_ «Я предполагаю, что проблема заключается в области, в которой моя матрица определена» _. Я не думаю, что это возможно. Если 'sud' определяется в верхней части файла, тогда все функции в этом файле должны иметь доступ и мутировать' sud'. – Kevin

ответ

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 линии здесь; в остальной части вашего кода 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 против сетки образца, ГВП любезно предоставленный, производит вывод, что кажется правильным.

+0

О, боже, я действительно это сделал. Я провел неловкое время, не нахожу это. Он работает, большое вам спасибо. – mrbaozi

Смежные вопросы