Si vous ne connaissez pas encore les règles du Sudoku, cherchez sur la toile!

On dispose de grilles complétées de Sudoku.

Votre mission est de vérifier qu'elles ont été correctement complétées, c'est à dire qu'elles ne contiennent pas d'erreur.

Voici quelques exemplaires des grilles dont on dispose:

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

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

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

Ces trois grilles sont correctes. Vous pourrez facilement en produire une fausse pour vos tests!

Vérifier qu'une ligne est correcte

def verifieLigne(grille, numero_de_ligne):
    """
    grille -- matrice suddoku
    numero_de_ligne -- numéro de ligne de la grille (entre 0 et 8)

    renvoie True si la ligne contient chacun des chiffres une fois et une seule, 
    False sinon.
    """
def verifieLignes(grille):
    """
    grille -- matrice sudoku

    renvoie True si chaque ligne respecte les règles du Sudoku, False sinon.
    """

 

 

 

une ligne
toutes les lignes

 

 

 

Vérifier qu'une colonne est correcte

def verifieColonne(grille, numero_de_colonne):
    """
    grille -- matrice suddoku
    numero_de_colonne -- numéro de colonne de la grille (entre 0 et 8)

    renvoie True si la colonne contient chacun des chiffres une fois et une seule, 
    False sinon.
    """
def verifieColonnes(grille):
    """
    grille -- matrice sudoku

    renvoie True si chaque colonne respecte les règles du Sudoku, False sinon.
    """

 

 

 

une colonne
toutes les colonnes

 

 

 

Repérer les zones carrées

Pour traiter le cas des zones carrées, nous allons faire un choix de numérotation des carrés et remarquer que nous pouvons décrire assez facilement les coordonnées de la cellule haut gauche de chaque carré à partir de cette numérotation.

Le choix de la numérotation des carrés est la suivante:

numéroter les carrés

 

 

 

Vérification

 

 

 

 

 

 

Contenu d'un carré

 

 

 

 

 

 

Contenu d'un carré par compréhension

 

 

 

Vérifier qu'une zone carrée est correcte

Écrire:

 

 

 

un carré
tous les carrés

 

 

 

Vérifier qu'une grille est correcte

Écrire maintenant une fonction vérifiant qu'une grille est correctement remplie.

Note

Il suffit de faire appel aux trois fonctions précédentes, c'est à dire de vérifier que chaque ligne, chaque colonne, chaque carré est correctement rempli.

 

 

 

Grille correcte

 

 

 

Factorisation de code

Dans le code complet de la question précédente, vous pouvez remarquer que les fonctions verifieCarresverifieColonnes et verifieLignes ont exactement la même structure.

Remplacez ces trois fonctions par une seule fonction verifieBlocs puis réécrire la fonction verifieGrille à l'aide de cette fonction 

Affichages : 1727