Невозможно изменить атрибут объекта после его изменения в методе объекта - PullRequest
0 голосов
/ 02 августа 2020

У меня есть небольшая система, которая должна решать судоку с использованием алгоритма поиска с возвратом, и она представлена ​​в форме класса Sudoku_Grid_System(). Метод solve() предполагает изменение значений из списка sudoku_grid. Я видел много ответов на похожий вопрос, и мой код (по крайней мере, для меня) кажется правильным, но он не работает - после вызова метода solve() sudoku_grid возвращается в исходное состояние. Очевидно, я упускаю что-то важное. Пожалуйста, взгляните на код:

class Sudoku_Grid_System():

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

def __init__(self, window, grid_image, x, y):
    self.window = window
    self.grid_image = pygame.image.load(grid_image)
    self.x = x
    self.y = y

......

def solve(self):
    for i in range(9):
        for j in range(9):
            if self.sudoku_grid[i][j] == 0:
                for n in range(1, 10):
                    if self.is_possible(i, j, n):
                        self.sudoku_grid[i][j] = n
                        self.solve()
                        self.sudoku_grid[i][j] = 0
                return

Когда программа выходит из циклов в методе solve() выше, отладчик сообщает мне, что значения sudoku_grid такие:

[5, 3, 4, 6, 7, 8, 9, 1, 2] [6, 7, 2, 1, 9, 5, 3, 4, 8] [1, 9, 8, 3, 4, 2, 5, 6, 7] etc...

Но сразу после выхода из метода solve() атрибут sudoku_grid возвращается в исходное состояние, которое выглядит следующим образом:

[5, 3, 0, 0, 7, 0, 0, 0, 0] [6, 0, 0, 1, 9, 5, 0, 0, 0] [0, 9, 8, 0, 0, 0, 0, 6, 0] etc...

Как сделать так, чтобы sudoku_grid оставался измененным после всех изменений в solve()?

1 Ответ

0 голосов
/ 02 августа 2020

Вы не предоставили достаточно кода, чтобы сказать однозначно, но я бы сказал, что проблема в том, что у вас нет механизма, чтобы определить, решили ли вы квадрат или когда, поэтому система возвращается к началу. Метод solve() должен возвращать логическое значение, указывающее, была ли проблема решена, и когда он вызывает себя рекурсивно, ему необходимо проверить этот результат:

def solve(self):
    for i in range(9):
        for j in range(9):
            if self.sudoku_grid[i][j] == 0:
                for n in range(1, 10):
                    if self.is_possible(i, j, n):
                        self.sudoku_grid[i][j] = n

                        result = self.solve()

                        if result:  # solved in recursion
                            return result

                        self.sudoku_grid[i][j] = 0

                return False  # nothing worked, backtrack

    return True  # solved, no more empty squares!

В самом верху самый вызов solve(), вы проверяете его логический результат, чтобы определить, была ли головоломка решена, или это неразрешимая (ошибочная) головоломка.

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