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