Sudoku - Département informatique de l`IUT
Transcription
Sudoku - Département informatique de l`IUT
Sudoku Sujet Proposé par Serge Iovleff 3 janvier 2007 1 Le jeu Un sudoku d’ordre n est une grille carrée de taille n2 × n2 , décomposée en n × n blocs de taille n × n, qu’il faut remplir avec les nombres de 1 à n2 comme suit : – les lignes et colonnes contiennent chaque nombre exactement une fois (c’est la définition d’un carré latin, étudié par Euler) – les blocs contiennent chaque nombre exactement une fois. Quelques cases sont déjà remplies au départ, en général de façon à rendre la solution unique. Par exemple, un sudoku d’ordre 2 et sa solution sont donnés par 3 2 1 3 4 2 1 4 4 2 1 3 3 4 2 1 2 1 3 4 Le format le plus populaire est le sudoku d’ordre 3 ; mais dans ce projet, il vous est demandé de résoudre et créer également des grilles d’ordre supérieur. Le format plus général d’une grille m × n avec m différent de n ne sera pas abordé. 2 2.1 Première partie : résoudre et créer des sudokus Résolution Le problème du sudoku se résout de façon étonnamment efficace par la force brute : on parcourt l’arbre des solutions partielles en remplissant de plus en plus de cases de la grille, tout en respectant les contraintes. Quand pour une case il n’y a pas de candidat possible, on a fait une erreur dans un choix précédent et revient en arrière. Dans un premier temps, il est demandé d’écrire un tel algorithme. Pour être capable de traiter des exemples dont le nombre de solutions abonde, le programme prendra en paramètre une borne supérieure sur le nombre de solutions cherchées qu’il affichera. Les grilles sont données dans un format texte évident ; l’exemple précédent pourra être décrit par le fichier exemple.sdk suivant : . . 4 . . 2 . . 3 . . . . 1 . . Des entrées au delà de 9 seront représentées par des lettres pour préserver la représentation compacte. 2.2 Création Pour créer sa propre grille, il est recommandable de démarrer avec la solution ; autrement, on risque de se retrouver avec des sudokus sans solution. Écrivez une routine qui crée une grille complétée, tirée avec probabilité uniforme parmi toutes ces grilles (la justification de l’uniformité fera partie du rapport écrit). Puis, déduisez-en une grille de jeu partiellement remplie. L’enjeu consiste à assurer que la grille aura une solution unique. En même temps, il ne faut pas donner trop de nombres pour garder le jeu intéressant ; pour un sudoku d’ordre 3, le nombre de cases données au départ 1 devra idéalement être entre 20 et 30. Pour traiter cette partie du projet, on fera appel à la routine de solution précédemment écrite. Arrivezvous à créer des sudokus d’ordre 4 en un temps raisonnable ? 3 3.1 Deuxième partie : maı̂triser la difficulté du jeu Estimer la difficulté d’une grille Avec l’algorithme de force brute écrit dans la partie précédente il n’est pas aisé d’obtenir des grilles intéressantes à résoudre : si on donne le minimum de nombres au départ, les grilles ont tendance à être relativement difficile ; si on en donne trop, elles deviennent triviales à résoudre. Il est donc intéressant d’estimer la difficulté d’une grille donnée. L’approche la plus simple consiste à compter le nombre d’étapes dans le parcours des solutions partielles, ou autrement dit la taille de l’arbre parcouru. Mais cette mesure ne correspond pas forcément à la difficulté que rencontre un joueur humain. Pour cela, il vaut mieux essayer de résoudre les grilles en suivant la logique humaine, c’est à dire en appliquant des règles sans recourir aux essais et retours en arrière. Par exemple, en regardant une case et les nombres déjà inscrits dans sa ligne, sa colonne et son bloc, il reste parfois un seul nombre possible. De façon duale, en fixant un nombre, il reste parfois une seule case possible dans une ligne, une colonne ou un bloc. Une multitude de telles règles sont répertoriées sur internet ; par exemple, http://www.simes.clara.co.uk/programs/sudokutechniques.htm http://www.mots-croises.ch/Manuels/Sudoku/ donnent une longue liste de règles classées en ordre croissant de complexité, le premier fournissant en plus des exemples de sudokus résolubles en appliquant ces règles. On appellera une grille ”facile” si elle est résoluble en utilisant seulement les premières règles de la liste, et ”difficile” s’il faut recourir à des règles plus complexes, et ce sans faire des essais et retours en arrière. En implantant les règles, essayez d’estimer la difficulté d’une grille donnée, et comparez avec l’estimation obtenue par le nombre d’étapes dans l’algorithme de force brute. La page de suivi contient quelques grilles allant de ”très facile” à ”très dur” selon le site http://www.sudoku-puzzles.net/. Est-ce que votre estimation de difficulté correspond à ce classement ? 3.2 Création d’une grille à difficulté donnée Si on se permet en plus des essais et retours en arrière, l’implantation de règles permet d’accélérer la recherche de solutions par force brute en éliminant des candidats. Quels temps mettez-vous désormais pour créer un sudoku d’ordre 4 ? Finalement, on souhaite créer des grilles d’un niveau de difficulté donné. Implantez un algorithme correspondant. 2