Nadat een timer en een counter werd toegevoegd aan mijn functie solve(), heb ik met verbazing opgemerkt dat mijn functie al 40 van 50 gegeven sudokus kon oplossen!
mijn functie is namelijk o.a. onderverdeeld in twee "test"-functies, only_one() en only_of().
only_one() gaat na of er maar een mogelijkheid is voor een vak terwijl only_of() nagaat of een mogelijkheid voor een vak nergens voorkomt in de mogelijkheden voor vakken in dezelfde rij, kolom of grote vak.
#try to solve all grids and write(partially) solved sudokus in a text-file
>>> solve(grids)
solved grids: 40/50
time: 14.739 s
click op meer lezen voor de functies only_one() en only_of()
def only_one(grid,empties):
global box_coords,new,update_empties
while True:
test = new(empties) #create a copy to use as change test
keys = list(empties.keys())
for key in keys:
[i,j] = [int(key[n]) for n in range(2)]
[I,J] = box_coords([i,j])
if len(empties[key]) == 1:
empties.update({key:empties[key][0]})
value = empties.pop(key)
grid[i][j] = value
update_empties(empties,value,[i,j,I,J])
if test == empties:
break
def only_of(grid,empties):
global box_coords,new,update_empties
while True:
test = new(empties) #create a copy to use as change test
keys = list(empties.keys())
for key in keys:
[i,j] = [int(key[n]) for n in range(2)]
[I,J] = box_coords([i,j])
values = empties[key]
row = [k for k in empties.keys()
if i == int(k[0]) and not k == key]
col = [k for k in empties.keys()
if j == int(k[1]) and not k == key]
box = [k for k in empties.keys()
if [I,J] == box_coords([int(k[0]),int(k[1])])
and not k == key]
for value in values:
#verificate if value is in row, column or box
not_in_row = not any([value in empties[coord]
for coord in row])
not_in_col = not any([value in empties[coord]
for coord in col])
not_in_box = not any([value in empties[coord]
for coord in box])
if not_in_row or not_in_col or not_in_box:
grid[i][j] = value
empties.pop(key)
update_empties(empties,value,[i,j,I,J])
break
if test == empties:
break
Geen opmerkingen:
Een reactie posten