Это код recursive Sudoku solve
, это не школьное задание. Я не могу понять, как заставить его «поддержать» мои предыдущие шаги. Он застревает в конце first row
, поскольку для этого места нет действительного номера, и он просто пытается найти тот, который там подходит. У меня проблемы с check
.Python Рекурсивный Sudoku Solver
После прочтения ваших ответов я сблизился с этим, но это не совсем так. Он поддерживает весь путь вверх и выходит из рекурсии
import sys
class Board:
def __init__(self, grid):
self.grid = grid
self.ogrid = grid
def get_col(self, col):
column = []
for i in self.grid:
column.append(str(i[col]))
return column
def get_row(self, row):
return self.grid[row]
def check_row(self, r, val):
row = self.grid[r]
for i in range(0,9):
if str(val) in row:
return False
return True
def check_col(self, column, val):
col = self.get_col(column)
for i in range(0,9):
if str(val) in col:
return False
return True
def check_square(self, x, y, val):
col = (y//3)*3
row = (x//3)*3
s = ''
for i in range(row, row+3):
for j in range(col, col+3):
s += str(self.grid[i][j])
if str(val) in s:
return False
return True
def check_cell(self, x, y, val):
if self.check_col(y, val) == False:
return False
elif self.check_row(x, val) == False:
return False
elif self.check_square(x, y, val) == False:
return False
return True
def check(self, x, y):
if y == 9:
y = 0
x += 1
if x == 9:
self.print_board()
sys.exit()
if self.ogrid[x][y] == '.':
for val in range(1,10):
if self.check_cell(x, y, val):
self.grid[x][y] = str(val)
self.check(x, y+1)
##I don't think the reset is working and I'm not sure why
if self.ogrid[x][y] == '.': #reset index
self.grid[x][y] = '.'
self.print_board() #Notice it never prints a '.' in spots that have changed
else:
self.check(x,y+1)
return
def print_board(self):
for i in range(0,9):
for j in range(0,9):
sys.stdout.write(self.grid[i][j])
if j == 2 or j == 5:
sys.stdout.write(' ')
if i == 2 or i == 5:
sys.stdout.write('\n')
print('')
def main():
f = open("./easySudoku.txt",'r')
s = ''
grid = []
row = []
for line in f:
s += line
print line
s = s.replace(' ','')
s = s.replace('\n','')
for i in range(0,9):
row = []
for j in range(0,9):
row.append(s[(i*9) + j])
grid.append(row)
sudoku = Board(grid)
sudoku.check(0,0, 1)
if __name__ == "__main__":
main()
Вот как предполагается, функция проверки работы
check
принимает й и у координаты для доски и начинается0,0
она проходит через цикл for от1-9
и устанавливает первое значение, которое работает с этим индексом, а затем переходит к следующему индексу. Когда он достигает конца строки, он перемещается вниз по одной строке и возвращается к первому столбцу. Если никакие значения не работают с индексом, обновите текущий индекс до'.'
и переместите индекс назад и продолжайте считать в направлении9
. то есть, если значение тока в индексе0,0
равно2
, то продолжайте движение до3
. Если3
работает, то переместите один индекс так далее и так далее до тех пор, пока плата не будет заполнена. Для упрощенного ответа он пытается каждое значение,1-9
, на каждом пустом индексе
Если это непонятно, то дайте мне знать
Также здесь есть совет, который я использую
..6 ..7 3..
.18 ..9 .5.
5.. ... .64
92. .8. ...
... 763 ...
... .9. .75
63. ... ..8
.9. 3.. 52.
..2 4.. 6..
Одна из проблем, с которыми вы сталкиваетесь, заключается в том, что 'self.grid' и' self.ogrid' являются одним и тем же объектом. Если вы измените его, вы измените другое. Вы должны сделать «deepcopy» или сохранить данные сетки по-другому. –
@JamesPringle Я заметил, что перед отправкой вашего обновления, когда я распечатал 'ogrid', и заметил, что он менялся, хотя он не должен – SirParselot