1- import numpy as np
2- import random
31from move import Move
42from sudoku import Sudoku
53
6- LEGIT_DIGITS = list (range (1 ,10 ))
7-
8- def solve_sudoku (sudoku : Sudoku ) -> Sudoku :
4+ LEGIT_DIGITS = list (range (1 , 10 ))
5+ SUDOKU_DIMENSION = 9
96
7+ def solve_sudoku (sudoku : Sudoku , row : int , column : int ) -> bool :
108 '''
119 Solve a given legal sudoku by appliying a
1210 backtracking strategy.
1311 '''
1412
15- if np .count_nonzero (sudoku .grid ) == 0 :
16- return sudoku
17-
18- # Test a move for the first nakedcell encountered
19- naked_cells_indexes = np .where (sudoku .grid == 0 )
20- first_naked_cell = (naked_cells_indexes [0 ][0 ], naked_cells_indexes [1 ][0 ])
21- #digits_in_row = sudoku.grid[first_naked_cell[0], :]
22- #digits_in_column = sudoku.grid[:, first_naked_cell[1]]
23- #digits_in_region = sudoku.get_region_from_move(Move(0, first_naked_cell[0], first_naked_cell[1]))
13+ # Return True when the last cell is achieved to avoid further backtracking
14+
15+ if (row == SUDOKU_DIMENSION - 1 and column == SUDOKU_DIMENSION - 1 ):
16+ print ("The solution to the Sudoku proposed is: \n " , sudoku .grid )
17+ return True
18+
19+ # If we're in the last column, move to the next row
20+
21+ if column == SUDOKU_DIMENSION :
22+ row += 1
23+ column = 0
24+
25+ if sudoku .grid [row , column ] > 0 :
26+ return solve_sudoku (sudoku , row , column + 1 )
2427
25- move = Move (0 , first_naked_cell [ 0 ], first_naked_cell [ 1 ] )
28+ move = Move (0 , row , column )
2629
2730 for digit in LEGIT_DIGITS :
2831 move .number = digit
29- sudoku .put_number (move )
30- if sudoku .check_legal_state (move ):
31- print ("Legal move" )
32- print (sudoku .grid )
33- solve_sudoku (sudoku )
34- move .number = 0
35- sudoku .put_number (move )
32+
33+ if sudoku .is_legal_state (move ):
34+ sudoku .put_number (move )
35+
36+ if solve_sudoku (sudoku , row , column + 1 ):
37+ return True
38+
39+ sudoku .grid [row , column ] = 0
40+
41+ return False
0 commit comments