Alors, voici un algorithme qui garantit de trouver le plus court chemin, avec une rapidité correcte.
- tu déclares une structure de ce type , qui servira à décrire la situation à n'importe quel moment :
| Struc
N0 : N1+N2 définis ci-dessous.
N1 : Nbre de pas parcourus
N2 : Nbre de pas minimum restants entre le point atteint et l'arrivée
CHEM1 : Chemin parcouru
GRILL1 : Etat actuel de la grille
CHGT : 0 si la grille est la grille initiale, nombre positif si la grille a évolué (ouverture d'une porte)
Fin
|
-
Tu déclares un tableau TB de cette Structure.
Chaque Structure STRUC est comme un scénario ; On a un tableau qui recense tous les scénarios, on fera en sorte de classer les scénarios du plus prometteur au moins prometteur ( tri sur N0 et N2 décroissants)
-
Tu insères dans ce tableau un seul enregistrement, qui correspond à la situation initiale :
Donc pour cette grille particulière, N1=0, CHemin_parcouru=Vide, CHGT=0.
-
Tu boucles indéfiniment sur les instructions ci-dessous.
4.1 Prendre la Première ligne du Tableau TB ; Supprimer cette ligne du tableau TB
4.2 A partir de la situation décrite dans cette structure, recenser les 3 ou 4 mouvements possibles.
Parmi les mouvements possibles, comment traiter les mouvements qui repassent sur une case où on est déjà passé ?
La variable CHGT sert à gérer ce cas. Si on est déjà passé par la case C au pas n°P, et s'il n'y a plus eu d'ouverture de porte depus P (CHGT<P), alors on ne peut pas repasser par cette case C, cela créerait des boucles infinies. Par contre on peut repasser par cette case C, si dans l'intervalle, il y a eu au moins une porte ouverte.
4.3 Si on a atteint la case arrivée, Solution trouvée, FIN
4.4 Pour chacun de ces 3 ou 4 mouvements, batir la nouvelle grille (en particulier si le mouvement ouvre une porte) :
Si le mouvement ouvre une porte, on fait : CHGT = N1.
Et insérer une nouvelle ligne dans le tableau TB.
Quand on insère une ligne, on fait en sorte que le tableau TB soit toujours trié sur N0 décroissant, et N2 décroissant. (Du scénario le plus prometteur au moins prometteur)
FIN
Si à un moment, le tableau TB est vide, c'est qu'il n'y a pas de solution.