Skip to content

Commit d381009

Browse files
committed
Add first solving approach, need to fix return
1 parent 265fbcf commit d381009

File tree

4 files changed

+54
-5
lines changed

4 files changed

+54
-5
lines changed

SudokuSolver/examples/ex2.csv

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
a,b,c,d,e,f,g,h,i
2+
0,0,0,7,0,8,0,0,0
3+
0,0,7,0,4,0,0,5,0
4+
0,3,0,0,0,2,8,0,0
5+
3,0,4,0,8,0,0,0,2
6+
5,7,0,2,0,0,0,0,3
7+
0,2,0,0,7,3,0,6,5
8+
0,0,0,6,5,0,0,2,0
9+
8,0,0,0,3,0,6,0,9
10+
0,0,0,8,0,0,0,7,4

SudokuSolver/main.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from read_sudoku import import_sudoku
2+
from sudoku_solver import solve_sudoku
3+
4+
def main() -> None:
5+
6+
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)
9+
10+
if __name__ == '__main__':
11+
main()

SudokuSolver/read_sudoku.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def is_solvable(sudoku: Sudoku) -> bool:
2020

2121
# Check there are at least 17 non 0 numbers for unique solution
2222

23-
if sudoku[sudoku.grid != 0].size < MINIMUM_NUMBERS_FOR_UNIQUE_SOLUTION:
23+
if sudoku.grid[sudoku.grid != 0].size < MINIMUM_NUMBERS_FOR_UNIQUE_SOLUTION:
2424
return False
2525

2626
# Check rows' legality
@@ -30,14 +30,14 @@ def is_solvable(sudoku: Sudoku) -> bool:
3030
return False
3131

3232
# Check columns' legality
33-
for column in np.nditer(sudoku, flags = ['external_loop'], order='C'):
33+
for column in np.nditer(sudoku.grid, flags = ['external_loop'], order='C'):
3434
column = column[column != 0]
3535
if np.unique(column).size != column.size:
3636
return False
3737

3838
# Check regions' legality
3939
for region_number in range(NUMBER_REGIONS):
40-
region = getattr(sudoku, 'region'+(region_number+1))
40+
region = getattr(sudoku, "{}{}".format('region',region_number+1))
4141
region = region[region != 0]
4242
if np.unique(region).size != region.size:
4343
return False

SudokuSolver/sudoku_solver.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,35 @@
1+
import numpy as np
2+
import random
3+
from move import Move
14
from sudoku import Sudoku
25

3-
LEGIT_NUMBERS = list(range(1,10))
6+
LEGIT_DIGITS = list(range(1,10))
47

58
def solve_sudoku(sudoku: Sudoku) -> Sudoku:
69

7-
return sudoku
10+
'''
11+
Solve a given legal sudoku by appliying a
12+
backtracking strategy.
13+
'''
14+
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]))
24+
25+
move = Move(0, first_naked_cell[0], first_naked_cell[1])
26+
27+
for digit in LEGIT_DIGITS:
28+
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)

0 commit comments

Comments
 (0)