1/2 Conservatoire National des Arts et Métiers NFP136 Valeur d

Transcription

1/2 Conservatoire National des Arts et Métiers NFP136 Valeur d
Conservatoire National des Arts et Métiers
NFP136 Valeur d'Accueil et de Reconversion en Informatique 2 - Année 2011
Projet : un solveur de Sudoku
Enseignant responsable : Eric Soutif ([email protected])
D’après un énoncé proposé au Cnam Poitou-Charentes en 2008
1) Description du projet
On souhaite implémenter un algorithme de résolution du problème du Sudoku. Une grille de Sudoku est
constituée d’un carré de 9 cases de côté. Ce carré est divisé en 9 sous-carrés que nous appellerons blocs
de 3 cases de côté. Chaque case peut contenir un chiffre compris entre 1 et 9. Les règles sont les
suivantes : chaque ligne, chaque colonne et chaque bloc doivent contenir une fois et une seule tout chiffre
compris entre 1 et 9. Initialement, certaines cases de la grille sont remplies, en respectant les règles cidessus.
Le but est de compléter la grille en respectant les règles (il peut exister plusieurs solutions, on n'en
demande qu'une seule).
Exemple : Grille initiale
6
2
9
7
5
5
9
9
2
1
5
6
1
8
7
1
8
4
2
5
6
9
3
4
8
4
2) Format des instances
Chaque instance du problème sera contenue dans un fichier texte disponible sur la page de l'UE et qu'il
conviendra de lire en début de programme. Les fichiers texte qui contiennent les grilles à résoudre seront
tous présentés de la façon suivante, illustrant la grille de l'exemple :
------------------------------------|| 6 | 2 |
||
| 7 | 5 ||
|
|
||
||
| 9 |
||
|
|
|| 5 |
|
||
||
|
|
||
| 9 |
||
| 1 |
||
------------------------------------||
|
| 9 || 6 |
|
|| 1 | 8 | 4 ||
||
|
|
||
|
|
||
|
|
||
|| 2 | 1 | 8 ||
|
| 7 || 9 |
|
||
------------------------------------||
| 5 |
||
| 3 |
||
|
|
||
||
|
| 4 ||
|
|
||
| 2 |
||
||
|
|
|| 8 | 4 |
||
| 5 | 6 ||
-------------------------------------
Fichier instance1.txt
3) Un algorithme récursif de résolution
Un principe récursif simple de résolution d’un problème de Sudoku est le suivant :
1/2
•
•
•
•
•
choisir une case libre, fixer le premier nombre possible selon les règles
essayer de résoudre le problème à partir de la prochaine case libre
si c’est un échec fixer un autre nombre possible et essayer de résoudre le problème à partir de
la prochaine case libre etc…
s’il n’y a plus de nombre possible alors c’est un échec.
si c’est la dernière case et qu’un nombre convient alors c’est un succès.
La classe sudoku devra être implémentée de sorte que chaque objet contienne un champ grille de type
int[][], matrice de dimension 9×9, grille[i][j] valant -1 si le chiffre n’est pas fixé, un chiffre de 1 à 9
sinon ;
Par ailleurs, il faudra impérativement implanter les méthodes suivantes :
1. Écrire un constructeur sudoku(int[][] grille_init) qui prend une grille grille_init en paramètre et
initialise la grille de l’objet ;
2. Écrire un deuxième constructeur sudoku(String nom_fich) qui prend en paramètre le nom d'un
fichier texte contenant une grille, au format indiqué au paragraphe 2), et qui initialise la grille de
l'objet ;
3. Écrire une méthode affichage() qui affiche à l'écran la grille, dans le même format que les
instances (cf. paragraphe 2) ;
4. Écrire une méthode ligne_coherente(int num_ligne), une méthode colonne_coherente(int
num_colonne), une méthode bloc_coherent(int num_bloc) et une méthode grille_coherente()
qui testent respectivement si une ligne, une colonne, un bloc ou la grille entière sont cohérents
compte tenu du remplissage de la grille. Les blocs sont numérotés de la façon suivante :
Bloc 1
Bloc 2
Bloc 3
Bloc 4
Bloc 5
Bloc 6
Bloc 7
Bloc 8
Bloc 9
5. Écrire une méthode récursive boolean resolution(int i, int j) qui retourne true si on a réussi à
remplir toutes les cases à partir de la case(i,j), false sinon. On impose d'examiner les cases dans
l'ordre des blocs, c'est-à-dire de commencer par examiner les cases du bloc 1, puis celles du bloc
2, et ainsi de suite jusqu'au bloc 9. On a trouvé la solution si resolution(0,0) retourne true.
4) Travail demandé et échéancier
Il conviendra d'implanter l'algorithme en respectant les indications fournies au paragraphe 3). En
particulier, il faudra :
-
Lire la grille à partir d’un fichier texte et initialiser le champ grille de l’objet
Utiliser la méthode récursive boolean resolution
Si on a trouvé une solution, afficher la grille solution à l’écran.
Le programme que vous aurez écrit devra être envoyé par email au responsable au plus tard le mardi 28
juin 2011 et une soutenance sera prévue à partir du 28 juin. Le projet est individuel et ne doit pas être
réalisé en binôme.
2/2