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