Projet d`informatique Résolution d`un Sudoku1 1 Présentation du jeu

Transcription

Projet d`informatique Résolution d`un Sudoku1 1 Présentation du jeu
Algorithmique et Langage C
I NFORMATIQUE
Projet d’informatique
—–
Résolution d’un Sudoku 1
1
Présentation du jeu
Allez voir à l’adresse suivante : http ://fr.wikipedia.org/wiki/Sudoku
2
Travaux préparatoires
– représenter efficacement un grille de Sudoku (pensez aux types structurés) ?
– initialiser correctement une grille à partir d’un fichier de donné
– afficher une grille de sudoku, ainsi que les informations utiles pour les cases non remplis (nombres
de possibilités)
3
Résolution d’un sudoku
Il existe de nombreuses méthodes de résolution. Nous proposons de décomposer le problème en trois
étapes. Nous allons d’abord nous focaliser sur deux méthodes déterministes qui permettent de résoudre
toutes les grilles de niveau « facile ». Ces deux méthodes sont répétées en alternance jusqu’à la résolution
du problème ou le blocage à un état partiellement résolu. Dans une deuxième étape, nous nous intéresserons
à l’évaluation de la difficulté de la grille. Dans la dernière étape, en se basant sur les étapes précédentes,
nous résoudrons les cas difficiles, voire « diaboliques ».
3.1
Résolution du Sudoku : Étape 1
3.1.1
Méthode de résolution par élimination
La recherche de la solution se fait en éliminant successivement les candidats d’une cellule de façon à
ne retenir qu’un seul candidat. Une fois ce candidat trouvé, il faut propager les conséquences sur les autres
cellules. Il suffit donc de balayer la grille pour rechercher les cases où une seule valeur est possible, de
mettre cette case à jour et de propager la conséquence sur les autres cases. La procédure s’arrête lorsque la
grille est résolue ou qu’il n’y a plus de cases à choix unique.
3.1.2
Méthode de résolution par forçage
C’est l’approche complémentaire de la précédente. Pour tous les chiffres de 1 à 9, on cherche les lignes,
les colonnes et les blocs où une seule case est possible pour cette valeur. Dans ce cas, on force la case à
cette valeur (même si d’autres valeurs étaient »possibles » pour cette case) et on propage les conséquences
aux autres cases. Plusieurs stratégies sont envisageables dans la succession des séquences par élimination
et des séquences par forçages.
3.1.3
Détermination de la résolution complète de la grille
Il est conseillé d’utiliser une variable globale qui fait le compte des cases libres. Lorsque le comptage
arrive à 0, la grille est résolue.
1. sujet proposeé par Thomas RODET
le langage C
3.2
Résolution du Sudoku : Étape 2
3.2.1
Évaluation de la difficulté des grilles
2
Modifier le programme précédent pour afficher le nombre de passage dans la boucle. Classer les problèmes résolus en très facile et moins facile. Comparez par rapport au niveau de difficulté annoncé. Pour les
grilles non résolvables par les méthodes précédentes, on va utiliser une méthode par essais et erreurs : avec
l’approche par hypothèse, une cellule avec seulement deux candidats est choisie et l’un des deux chiffres
est inscrit dans la cellule. Les étapes précédentes (élimination/forçage) sont répétées et mènent soit à une
contradiction (chiffre dupliqué ou cellule sans candidat), soit à une proposition valide. Évidemment, dans
le cas d’une contradiction, le deuxième chiffre fait partie de la solution. Dans ce cas, il est nécessaire de ne
pas modifier la grille de départ. Il faut donc travailler uniquement sur des copies ou être capable de restaurer
l’état de départ.
Une solution simple consiste à remplir un nouveau tableau de structures qui contient pour chaque case
intéressante :
– la position de la case
– éventuellement la répétition du nombre de choix
– le résultat pour chaque choix de l’application des algorithmes de l’étape 1.
3 cas sont à considérer
1. il reste des cases non trouvées
2. toutes les cases sont trouvées
3. la valeur choisie conduit à une contradiction
En explorant le résultat de ce tableau, en déduire la difficulté de la grille.
3.3
Résolution du Sudoku : Étape 3
Si il reste peu de temps, on peut appliquer les résultats précédents soit manuellement (en demandant de
rentrer la case et la position du choix (1 ou 2) à effectuer, soit automatiquement en analysant les résultats
obtenus à l’étape 2. Si le temps disponible le permet, il est aussi possible de programmer les algorithmes
des deux méthodes ci dessous.
Si pour les grilles faciles, les méthodes ci-dessus sont suffisantes, pour les cas plus difficiles il faut
faire des hypothèses ou rechercher des « contingences », c’est-à-dire de tenter de déterminer les cellules
candidates (au nombre de deux ou trois) pour un chiffre en particulier.
3.3.1
L’algorithme de Nishio
C’est une forme épurée de léapproche par hypothèse : pour chaque candidat déune cellule, est-ce qu’insérer un chiffre en particulier prévient léinscription de ce candidat ailleurs dans la grille ? Si la réponse est
oui, alors le candidat est éliminé.
3.3.2
L’élimination du candidat orphelin
c’est l’une des techniques les plus utilisée. Les cellules avec un même ensemble de candidats sont dites
couplées si le nombre de candidats dans chacune d’elle est égal au nombre de cellules qui peuvent les
accueillir. Par exemple, deux cellules sont couplées si elles contiennent une paire unique de candidats (p,q)
dans une rangée, une colonne ou une région ; trois cellules sont dites couplées si elles contiennent un triplet
unique de candidats (p,q,r). Ces chiffres ne peuvent apparaitre ailleurs, car il y aurait conflit selon la rangée,
la colonne ou la région. Pour cette raison, les candidats (p,q,r) qui se trouvent dans les autres cellules sont
à éliminer. Ce principe vaut avec des sous-ensembles de candidats : si trois cellules ont seulement (p,q,r),
(p,q), (q,r) , ou (p,r), (q,r), (p,q) , tous les candidats de cet ensemble qui se trouvent dans les autres cellules
sont à éliminer. Ce concept peut être étendu à plusieurs rangées, plusieurs colonnes et plusieurs régions.
le langage C
4
3
Création de grille du Sudoku :
Si vos algorithmes sont capables de résoudre des grilles difficiles, et qu’il vous reste encore du temps,
vous pouvez essayer de générer une grille de Sudoku avec un minimum de cases remplies au départ. Il faut
respecter les 2 conditions suivantes :
1. la grille doit avoir une solution
2. celle-ci doit être unique.
Vous pouvez partir d’une grille vide et essayer de la remplir ou partir d’une grille pleine et éliminer des
cases.