Licence Informatique Universit´ Bordeaux 1 e 2006-2007

UE INF203 Programmation par objets Travaux Dirig´s e feuille 5

T´l´charger les fichiers qui accompagnent le td ` l’aide de la commande ee a wget http://dept-info.labri.fr/ENSEIGNEMENT/poo/src/fichiers-5.tar.gz puis d´compacter cette e archive au moyen de la commande tar -xvzf fichiers-5.tar.gz. Se placer dans le r´pertoire td05. e

Techniques de r´solution des Sudoku e
Une grille de sudoku est un matrice 9x9 partionn´e en 9 carr´s 3x3. Cette grille contient des chiffres de e e 1 ` 9 et a les propri´t´s suivantes : a ee chaque ligne de 9 cases contient tous les chiffres de 1 ` 9. a chaque colonne de 9 cases contient tous les chiffres de 1 ` 9. a chaque carr´ de la partition contient tous les chiffres de 1 ` 9. e a Il ne peut donc y avoir deux fois le mˆme chiffre ni dans une ligne ni dans une colonne, ni dans un carr´ e e de la partition. Le jeu consiste ` remplir une grille qui a ´t´ fournie incompl`te. a ee e On vous propose d’´crire un certain nombre de m´thodes qui permettent de r´soudre une partie des e e e probl`mes de Sudoku qui paraissent dans la presse. e Vous utiliserez la classe Liste vue en cours, qui contient le constructeur de la liste vide et les m´thodes e d’instances publiques suivantes : int longueur () retourne le nombre d’entiers de la liste boolean appartient(int a) indique si l’entier a appartient a la liste void ajoutDebut(int a) ajoute l’entier a en debut de la liste String toString () transforme une liste en chaine de caract`res e void supprimer (int a) supprime l’entier a de la liste int valeur() retourne la valeur du premier ´l´ment de la liste ee boolean equals(Object o retourne true si les liste sont ´gales(mˆmes valeurs dans le mˆme ordre e e e La classe Sudoku contient les champs suivants – une grille gr qui contient les valeurs connue de la grille ` r´soudre (une valeur ´gale ` z´ro signifie que a e e a e l’on n’a pas encore rempli la case correspondante). – Un tableau ` deux dimensions grL contenant des listes d’entiers ; ainsi grl[i][j] contiendra la Liste a des entiers que l’on peut ´ventuellement inscrire dans la case gr[i][j], c’est ` dire tous les entiers qui e a ne sont pas sur la ligne i, la colonne j ou sur le carr´ 3x3 qui contient la case gr[i][j]. e On dispose d’une ´bauche de la classe Sudoku et d’une classe SudokuTest. Cette derni`re classe contient e e un certain nombre de grilles de Sudoku destin´es ` r´aliser vos tests. e a e

1

constructeur et initialisations
´ 1. Ecrire une m´thode String toString() qui retourne une chaˆ repr´sentant la grille de sudoku e ıne e sous la forme d’une matrice carr´e 9x9. e Les cases dont la valeur n’est pas fix´e seront repr´sent´es par des *. e e e ´ 2. Ecrire une m´thode copieGrille(int[][] grille) qui initialisera le champ gr avec une copie de e la grille fournie en param`tre. e ´ e a 3. Ecrire une m´thode void initgrL() initialisant le tableau ` deux dimensions grL. Avant d’´crire cette m´thode, e e – on ´tudiera le code de la m´thode boolean possible(int a, int i, int j) qui vous est e e fournie – puis on ´crira une m´thode Liste initListe(int i, int j) qui contient la liste des entiers e e que l’on peut inscrire dans la case gr[i][j]. On utilisera pour cela la m´thode possible. e Par convention, le r´sultat sera la liste vide s’il y a une valeur diff´rente de 0 dans la case e e gr[i][j].

1

4. Utiliser la m´thode public String listeDesPossibles(int i, int j) pour afficher la liste grL[0][2] e et v´rifier votre m´thode initgrL. e e

2

r´solution : ´tape 1 e e
´ 1. Ecrire une m´thode void supprimer (int a, int i, int j) qui supprime l’entier a des listes e grL[][] pour toutes les cases qui se trouvent sur la mˆme ligne, la mˆme colonne ou le mˆme carr´ e e e e 3x3 que la case gr[i][j]. On s’inspirera de la m´thode possible pour la fa¸on de parcourir toutes e c les cases qui se trouvent sur cette ligne, colonne ou carr´. e ´ 2. Ecrire une m´thode void placer (int a, int i, int j) qui inscrit l’entier a dans la case gr[i][j], e supprime a des listes de possibles sur les cases de la mˆme ligne, mˆme colonne ou mˆme carr´ 3x3 e e e e et qui affecte la Liste vide grL[i][j]. ´ 3. Ecrire une m´thode boolean ajoutUniquePoss() qui parcourt toutes les listes grL[i][j], et dans e le cas o` l’une d’entre elles contient un seul entier a inscrit cet entier dans la case correspondante. u Cette m´thode devra retourner true si elle a rencontr´ une telle possibilit´ et false dans le cas e e e contraire. 4. Utiliser la m´thode par resoudre pour voir laquelle des 7 grilles donn´es peut ˆtre compl`tement e e e e remplie par cette technique.

3

r´solution : ´tape 2 e e

On se propose de mettre en œuvre une autre technique pour r´soudre les cas r´calcitrants. On va chercher e e si pour une ligne i, et un entier a il existe une seule des cases de la ligne i qui peut contenir a. ´ 1. Ecrire une m´thode int uniqueSurLigne(int a, int i) qui retourne : e – -1 si l’entier a figure sur strictement plus d’une des listes de des cases de la ligne i ou sur aucune des listes des cases de cette ligne. – Le nombre j si cet entier ne figure que sur la liste grL[i][j] de cette ligne. ´ 2. Ecrire une m´thode boolean ajoutSurLigne(int i) qui cherche pour tout entier a compris entre e 1 et 9, s’il ne figure que dans une des listes de la ligne i et dans ce cas le place sur gr dans la case correspondante. Cette m´thode retourne true si un tel entier existe et false dans le cas contraire. e ´ 3. Ecrire une m´thode boolean ajoutSurLignes() qui effectue le mˆme travail sur toutes les lignes. e e 4. Utiliser la m´thode par resoudre qui applique tant que cela est possible les deux techniques, e ajoutUniquePoss et ajoutSurLignes pour compl´ter une grille de Sudoku. V´rifier, sur les exemples e e donn´s, quelles sont les grilles que l’on peut remplir compl´tement par ces deux techniques. e e 5. Ecrire des m´thodes qui pemettent d’appliquer pour les colonnes la technique d´velopp´e sur les e e e lignes dans les questions pr´c´dentes. On ´crira ainsi les m´thodes suivantes : e e e e int uniqueSurColonne(int a, int j) retourne l’unique case de la colonne j pouvant contenir a boolean ajoutSurColonne(int j) idem ajoutSurLigne mais usr les colonnes boolean ajoutSurColonnes() effectue l op´ration pr´c´dente sur toutes les colonnes e e e 6. Utiliser la m´thode par resoudre qui applique tant que cela est possible les trois techniques,ajoutUniquePoss, e ajoutSurLignes et ajoutSurColonnes pour compl´ter une grille de Sudoku. e Si n´cessaire, factoriser les m´thodes pr´c´demment d´finies pour ´viter la duplication de code. e e e e e e

4

Compl´ments - r´solution : ´tape 3 e e e

Si dans un carr´ 3x3, il existe une ligne o` il ne manque que deux cases, et que les listes de possibles e u pour ces deux cases sont de longueur 2 et sont ´gales, alors les deux valeurs des listes de possibles e sont n´cessairement sur cette ligne. On peut donc supprimer les deux valeurs des listes de possibles des e lignes restantes du carr´. Le travail r´alis´ sur les lignes peut ˆtre effectu´ sur les colonnes. Appliquer le e e e e e raisonnement pr´c´dent pour d´finir une troisi`me ´tape de r´solution, puis modifier la m´thode r´soudre e e e e e e e e en consequence. Remarque : on peut appliquer le mˆme principe avec trois valeurs et des listes de longueur 3. e 2

Sign up to vote on this title
UsefulNot useful