Résoudre un grille SUDOKU de façon récursive.

 

 

        Sur youTube, il y a ce type, professeur Thorsten Altenkirch, qui anime la série COMPUTERPHILE avec 2,44m d’abonnés.

 

 

 

 

 

 

 

 

 

Voici son sudoku à résoudre

 

 

Pour remplir la grille, à chaque position libre (y : la ligne et x : la colonne) une valeur n est tentée. Voici son code :

 

 

IL donne un exemple de vérifier si 3 peut être entré à la position (4;4)

 

 

Voici sa solution récursive

 
 

Autre solution plus détaillée

 

#########################################


def celluleVideSuiv(grille):

    # trouve la prochaine cellule vide (-1)

    # retourne le couple (li, co) ou none,none si aucun
   
# ne pas oublier que les indices sont 0-8

   
for li in range(9):
       
for co in range(9):  # range(9) est 0, 1, 2, ... 8
           
if grille[li][co] == -1:
               
return li, co

   
return None, None  # aucun

def est_valid(grille, choix, li, co):
   # vérifions la ligne
   
vals_li = grille[li]
   
if choix in vals_li:
       
return False

   #
vérifions la columne
   
vals_co = [grille[i][co] for i in range(9)]
   
if choix in col_vals:
       
return False

   
# vérifions le carré
   
li_dep = (li // 3) * 3
   
co_dep = (co // 3) * 3
   
for r in range(li_dep, li_dep + 3):
       
for c in range(co_dep, co_dep + 3):
           
if grille[r][c] == choix:
               
return False
   return True

def
resout_sudoku(grille): # solution récursive
       
# retourne la première solution qui existe

    # si elle existe, transforme la grille pour être
   #
cette solution

        # étape 1: choisir une position sur la grille
   #
étape 1: appellé choix
   
row, col = celluleVideSuiv(grille)
   
# étape 1.1: si aucune position, alors terminé
   
if row is None:  # ceci est vrai si « celluleVideSuiv »                                           # retourne « None, None »
       
return True
   
# étape 2: si une place pour placer un nombre,

        # alors faire choix entre 1 et 9
   
for choix in range(1, 10):  # range(1, 10) est [1...9]
   #
étape 3: vérifier la validité de ce choix
       
if is_valid(grille, choix, row, col):
   
# étape 3.1: si ce choix est valide, placer dans grille
           
grille[row][col] = choix
   
# étape 4: alors on crinque recursivement resout_sudoku!
           
if solve_sudoku(grille):
               
return True

   
# étape 5: si choix non valide,reculer,testerAutreNombre
       
grille[row][col] = -1

   
# étape 6: si aucun nombre, alors cette grille est

    # SANS SOLUTION!!
   
return False

exemple_grille =

        [[3, 9, -1, -1, 5, -1, -1, -1, -1],
        [-
1, -1, -1, 2, -1, -1, -1, -1, 5],
        [-
1, -1, -1, 7, 1, 9, -1, 8, -1],
        [-
1, 5, -1, -1, 6, 8, -1, -1, -1],
        [
2, -1, 6, -1, -1, 3, -1, -1, -1],
        [-
1, -1, -1, -1, -1, -1, -1, -1, 4],
        [
5, -1, -1, -1, -1, -1, -1, -1, -1],
        [
6, 7, -1, 1, -1, 5, -1, 4, -1],
        [
1, -1, 9, -1, -1, -1, 2, -1, -1] ]


print(solve_sudoku(exemple_grille))
pprint(ex
emple_grille)

 

fin de autre solution