CRISTANTE Jérôme ILHAN Yilmaz S3B Rapport du TP : Résolution du jeu Carré de 100 Notre jeu se compose d’un tableau d’entier à double entrée modélisant la grille, d’un entier « taille » et d’un entier « num » qui représente respectivement la taille du côté de la grille et le nombre à placer. 1) Carre_n : Pour savoir si l’algorithme de recherche avec retour arrière a effectué avec réussite le placement des nombres, un booleen « echec » est retourné. L’algorithme consiste à balayer les cases voisines, d’un case donnée en paramètre, et de remplier ces cases si elles sont vides. L'ordre de balayage des cases est : Bas, Gauche, Haut, Droit, Bas-Droit, Bas-Gauche, HautGauche, Haut-Droit. La position d’un nombre doit satisfaire plusieurs conditions : - que ses coordonnées soient existantes dans la grille - que ses coordonnées indiquent une case vide Si c’est le cas, le nombre est placé et il est incrémenté. L’algorithme est appelé à nouveau sur les cases voisines jusqu’à ce que la grille soit remplie, c’est-à-dire que le nombre à placer soit supérieur au carré de la taille du côté de la grille. Si aucune des cases voisines ne conviennent, le nombre, à la dernière étape de la solution partielle, est effacé (on réinitialise la case de la grille) et décrémenté. Et on continue avec la case voisine. Si une solution finale est trouvée, on arrête le balayage grâce au booleen « echec », ainsi la fonction arrête les appel à elle même. Algorithme informel : Fonction remplirGrille ( x : entier, y : entier) : booléen Début Si num > taille * taille alors Echec faux Sinon Echec vrai Si x > 0 et x < taille et y > 0 et y < taille et non-echec alors Grille[x][y] num Num num + 1 Pour i de 1 à 8 faire Si i = 1 alors echec remplirGrille(x, y+3) Si i = 2 alors echec remplirGrille(x-3, y) Si i = 3 alors echec remplirGrille(x, y-3) Si i = 4 alors echec remplirGrille(x+3, y) Si i = 5 alors echec remplirGrille(x+2,y+2) Si i = 6 alors echec remplirGrille(x-2, y+2) Si i = 7 alors echec remplirGrille(x-2, y-2) Si i = 8 alors echec remplirGrille(x+2, y-2) Si echec alors Grille[x][y] um num – 1 Fsi Fpour Fsi Fsi Retourne echec Fin Lexique : x : entier, coordonnée sur l’axe des abscisses y : entier, coordonnée sur l’axe des ordonnées i : entier, itérateur taille : entier, taille du côté de la grille Grille : tableau[0…taille][0…taille] Echec : boolean, faux lorsque la grille est remplie Num : entier, nombre à placer dans la grille 2) Carre_n_All : Pour afficher les différentes grilles solutions et pour donner le nombre de solutions trouvées, un entier en guise de compteur et un booleen ont été rajouté en paramètre de la classe. Le principe est le même que pour Carre_n, sauf que cette fois-ci, une fois qu’on a trouvé une solution, on n’arrête pas le balayage des autres possibilités. Pour cela, lorsque l’on trouve une solution, on bloque l’appel récursif de la fonction sur les cases voisines de la dernière case remplie avec le booleen « affiche ». Puis on réinitiale ce boolean, on efface et décremente le nombre, afin de chercher les solutions à l’étape précédente. A chaque fois qu’une solution est affichée, le compteur est incrémenté. Algorithme informel : Fonction remplirGrille ( x : entier, y : entier) Début Si num > taille * taille et non-affiche alors Afficher(Grille) Affiche vrai Compteur compteur + 1 Sinon Si x > 0 et x < taille et y > 0 et y < taille et non-affiche alors Grille[x][y] num Num num + 1 Pour i de 1 à 8 faire Si i = 1 alors echec remplirGrille(x, y+3) Si i = 2 alors echec remplirGrille(x-3, y) Si i = 3 alors echec remplirGrille(x, y-3) Si i = 4 alors echec remplirGrille(x+3, y) Si i = 5 alors echec remplirGrille(x+2,y+2) Si i = 6 alors echec remplirGrille(x-2, y+2) Si i = 7 alors echec remplirGrille(x-2, y-2) Si i = 8 alors echec remplirGrille(x+2, y-2) Grille[x][y] um num – 1 Affiche faux Fpour Fsi Fin Lexique : x : entier, coordonnée sur l’axe des abscisses y : entier, coordonnée sur l’axe des ordonnées i : entier, itérateur taille : entier, taille du côté de la grille Grille : tableau[0…taille][0…taille] Affiche : boolean, vrai lorsque la grille est remplie et est affichée Num : entier, nombre à placer dans la grille Compteur : entier, nombre de solutions Affiche() : fontion qui affiche la solution