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