Skip to content

Commit a1e6993

Browse files
committed
Fix sudoku solving and solution printing
1 parent d381009 commit a1e6993

File tree

3 files changed

+40
-28
lines changed

3 files changed

+40
-28
lines changed

SudokuSolver/main.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
def main() -> None:
55

66
sudoku_to_be_solved = import_sudoku()
7-
sudoku_solved = solve_sudoku(sudoku_to_be_solved)
8-
print("The solution to the sudoku proposed is:\n", sudoku_solved.grid)
7+
solve_sudoku(sudoku_to_be_solved, 0, 0)
98

109
if __name__ == '__main__':
1110
main()

SudokuSolver/sudoku.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,18 @@ def put_number(self, move: Move) -> None:
2020

2121
self.grid[move.row, move.column] = move.number
2222

23-
def check_legal_state(self, previous_move: Move) -> bool:
23+
def is_legal_state(self, new_move: Move) -> bool:
2424

25-
row_to_check = self.grid[previous_move.row, :].copy()
26-
column_to_check = self.grid[:, previous_move.column].copy()
27-
region_to_check = self.get_region_from_move(previous_move)
25+
# Make the movement, take copies of the grid and remove the movement
26+
27+
self.put_number(new_move)
28+
29+
row_to_check = self.grid[new_move.row, :].copy()
30+
column_to_check = self.grid[:, new_move.column].copy()
31+
region_to_check = self.get_region_from_move(new_move).copy()
32+
33+
reset_move = Move(0, new_move.row, new_move.column)
34+
self.put_number(reset_move)
2835

2936
# Remove 0's from the areas to be checked
3037

SudokuSolver/sudoku_solver.py

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,41 @@
1-
import numpy as np
2-
import random
31
from move import Move
42
from 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

Comments
 (0)