Эта строка:
self.grid[y][x] = 0
постоянно вызывается после того, как решение завершено. Для проверки поместите любое выражение print
непосредственно перед или после него. Вы увидите, что его вывод появится как до, так и после вывода «Решено».
Я плохо разбираюсь в теории судоку, но это простое исправление сработало для меня. Инициализируйте атрибут solved
в инициализаторе:
self.solved = False
Когда вы знаете, что закончили, установите для него значение True
:
print('Solved')
print(np.matrix(self.grid))
self.solved = True
И затем вложите код обнуления в условное:
if not self.solved:
self.grid[y][x] = 0
Теперь эта команда будет пропущена, если ваша головоломка уже решена. Может быть более элегантный способ реализации алгоритма, но это исправляет функциональность вашего кода.
(Обратите внимание, что, как указано в ответе Яна Уилсона, в вашем текущем коде solver.grid
и содержащий класс self.grid
- это одно и то же, поэтому решатель активно изменяет исходную сетку, предоставленную ему. Это может быть, а может и не быть тем, что вы намеревались.)