Как использовать переменную в функции, которая возвращает None? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть следующая функция, она используется для решения сетки судоку. Как я могу изменить код так, чтобы он возвращал решенную матрицу, чтобы я мог использовать его для чего-то другого, а не только для печати? Функция в основном использует рекурсию, чтобы опробовать все возможные решения для сетки судоку, и заполняет число, если оно принадлежит определенной позиции. источник: https://www.youtube.com/watch?v=G_UYXzGuqvM&t=455s

matrix = np.array([[9,0,7,   1,0,0,   0,0,0],
                   [0,0,0,   0,0,0,   0,0,0],
                   [5,0,0,   3,0,0,   0,6,9],

                   [0,0,1,   6,5,0,   8,0,0],
                   [0,3,0,   0,8,0,   0,4,0],
                   [0,0,6,   0,3,9,   1,0,0],

                   [4,2,0,   0,0,6,   0,0,8],
                   [0,0,0,   0,0,0,   0,0,0],
                   [0,0,0,   0,0,2,   5,0,7]])

def grid(i,j): # function which splits the matrix up into 9 grids
    if i < 3 and j < 3:
        return matrix[0:3,0:3]
    elif  i < 3 and 3 <= j < 6 :
        return matrix[0:3,3:6]
    elif  i < 3 and 6 <= j < 9 :
        return matrix[0:3,6:9]
    elif  3 <= i < 6 and j < 3 :
        return matrix[3:6,0:3]
    elif  3 <= i < 6 and 3 <= j < 6 :
        return matrix[3:6,3:6]
    elif  3 <= i < 6 and 6 <= j < 9:
        return matrix[3:6,6:9]
    elif  6 <= i < 9 and j < 3 :
        return matrix[6:9,0:3]
    elif  6 <= i < 9 and 3 <= j < 6 :
        return matrix[6:9,3:6]
    elif  6 <= i < 9 and 6 <= j < 9 :
        return matrix[6:9,6:9] #

def possible(i,j,n): # function which tells us if a number is possible in a certain position
    if all(matrix[i][m] != n and matrix[m][j] != n for m in range(9)) and n not in grid(i,j):
        return True
    else:
        return False

def solve(): # function which solves the puzzle and fills in correct digits
    global matrix
    for i in range(9):
        for j in range(9):
            if matrix[i][j] == 0:
                for n in range(1,10):
                    if possible(i,j,n):
                        matrix[i][j] = n
                        solve()
                        matrix[i][j] = 0
                return
    print(matrix)


solve()

Я пытался использовать return matrix, но это просто возвращает исходную матрицу

1 Ответ

1 голос
/ 16 марта 2020

Проблема с вашим кодом в том, что вы работаете с глобальной матрицей. Где-то в глубине рекурсивных вызовов вы находите решение (и распечатываете его), но при возврате в стек вы сбрасываете все поля обратно на 0. (См. Комментарий Чепнера.)

Учитывая, что вы кодируете в «процедурном» style ", почему бы не использовать вторую глобальную переменную (скажем, solution) и назначить глубокую копию.

from copy import deepcopy

...


solution = deepcopy(matrix)

Конечно, вы также можете реструктурировать код в более функциональном стиле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...