CRISTANTE Jérôme

publicité
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
Téléchargement