-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbacktracking.py
65 lines (53 loc) · 1.67 KB
/
backtracking.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
"""
SudokuPyCSF - Solve sudoku with Python using CSF approach
Version : 1.0.0
Author : Hamidreza Mahdavipanah
Repository: http://github.com/mahdavipanah/SudokuPyCSF
License : MIT License
"""
import math
def sudoku_is_complete(sudoku):
for row in sudoku:
for var in row:
if var == 0:
return False
return True
def value_is_consistent(sudoku, var_i, var_j, val):
# Check row
for var in sudoku[var_i]:
if var != 0 and var == val:
return False
# Check column
for row in sudoku:
if row[var_j] != 0 and row[var_j] == val:
return False
# Check block
sqrt_n = int(math.sqrt(len(sudoku)))
block_i = int(var_i / sqrt_n)
block_j = int(var_j / sqrt_n)
qs = range(sqrt_n)
for i in [block_i * sqrt_n + q for q in qs]:
for j in [block_j * sqrt_n + q for q in qs]:
if (i, j) != (var_i, var_j) and sudoku[i][j] != 0 and sudoku[i][j] == val:
return False
return True
def backtracking_search(sudoku, var_selector, check=None):
if sudoku_is_complete(sudoku):
return sudoku
var_i, var_j, domain = var_selector(sudoku)
for val in domain:
if check:
if type(check) is bool:
if not check:
continue
else:
if not check(sudoku, var_i, var_j, val):
continue
else:
if not value_is_consistent(sudoku, var_i, var_j, val):
continue
sudoku[var_i][var_j] = val
result = backtracking_search(sudoku, var_selector)
if result:
return result
sudoku[var_i][var_j] = 0