Sudoku

Transcription

Sudoku
Algorithmique Avancée:
Exercices : Backtracking
9 Mai 2007
Résolution d’un Sudoku.
Le but de cet exercice est de remplir une grille de sudoku, un carré de 9 cases de coté, subdivisé
en 9 blocs identiques, de sorte que chaque ligne, colonne et bloc contienne une fois et une seule
chaque chiffre de un à neuf. L’algorithme doit retourner toutes les possibilitées si plusieurs existent
et être écrit en pseudo-code.
Pour commencer, on va considérer que la grille est vide, le principe de cet algorithme est de d’abord
placer tout les 1 et que des 1, puis pareil pour les 2, et ainsi de suite.
1. Pour commencer on définit deux fonctions :
appartient(k, vecteur) qui teste si un élément k est ou non présent dans un vecteur de taille
9 et renvoie un booléen.
quel bloc(i, j) qui pour la case en colonne i et ligne j avec i et j de 1 à 9, renvoie le numéro
du bloc auquel elle appartient. Le choix de l’ordre des blocs est laissé libre.
Ecrire ces 2 fonctions.
2. Pour cette question on s’interesse uniquement à placer des 1 dans une grille vide.
La position des 1 dans la grille est donnée par un vecteur position U N de taille 9, qui contient
pour chaque colonne la ligne dans laquelle est placé ce 1. Ainsi s’il y a un 1 en case (i, j),
alors position U N (i) = j. On va également s’aider d’un vecteur bloc U N de même taille qui
indique si un 1 à déjà été placé dans chacun des blocs.
Ecrire une fonction résursive utilisant le principe du backtracking place U N (i, position U N, bloc U N ),
qui place le 1 de la colonne i et les suivants en fonction des contraintes de ligne et de bloc,
puis imprime les vecteurs positions tels que tous les 1 ont été placés conformément aux règles
du sudoku.
1
3. Une fois tous les 1 placés, on place ensuite les 2 selon le même principe, puis les 3 et ainsi
de suite. Donc en lieu et place de l’impression, on commence à placer dans la grille la valeur
suivante.
Pour s’aider, on rajoute un tableau grille de dimension 9 par 9, qui indique si on a placé
un chiffre ou pas dans la case (i, j). Ce tableau doit-il contenir des booléens ou les chiffres
eux-mêmes ? Justifiez ce choix.
Modifier la fonction de la question 2 pour obtenir la fonction place(k, i, position, bloc, grille)
où k correspond au chiffre que l’on place dans la grille. Il est donc au départ initialisé à 1 et
est incrémenté quand les 9 éléments de valeur k ont été placés.
position et bloc restent-ils des vecteurs ou deviennent-ils des matrices ? Justifiez votre choix
en prenant garde aux ré-initialisations.
Cette fonction devra au final imprimer toutes les grilles complètes possibles à partir d’une
grille vide.
4. Il reste maintenant à résoudre le cas où la grille initiale était déjà en partie remplie. Expliquer
quelles modifications apporter à la fonction précédente, et comment initialiser les différents
vecteurs et matrices, pour qu’une fonction sudoku(grille) prennant en entrée une grille de
sudoku classique imprime toutes les solutions possibles.
5. Implémentez maintenant la fonction sudoku(grille) prenant en entrée une grille de sudoku
classique et qui en imprime toutes les solutions possibles, si elles existent. Testez cet algorithme sur quelques grilles de votre choix (internet ou journaux). Vous devrez envoyer le code
source, les grilles choisies ainsi que des commentaires sur vos choix pour le code, les solutions
obtenues et la vitesse d’execution de l’algorithme à l’assistant pour le Mardi 15 Mai 12h au
plus tard.
2