====== Solution d'un labyrinthe ====== ===== Données ===== On vous fournit un labyrinthe sous forme d'un fichier texte. * Les murs sont symbolisés par le caractère ''%%*%%'', * le point de départ, qui doit être unique, est symbolisé par le caractère ''%%D%%'', * les arrivées (il en faut au moins une) sont symbolisées par le caractère ''%%A%%''. Voici un exemple : ******************* *D* *A * * ******** ****** * * * ******************* Vous pouvez télécharger {{ .:laby_exemple.txt |}} dont le contenu est : **************************************************************************************** * * ** * * **** ****** ********************************** * * ******************************* * * * * * ****** * * * * **** **** ****************************** * * * ******* ************** ******* * * * * * * * * * * * * ****** * * * * ** * * * * * * * ** * * * ************** * **** * * * * * *** ***** * * *** * ***** * * * ********* * * * * ****** * *********** ** * * * * * * * * * *** * * ************ *** * * * * * * * ******* * * ***** * * * ******** * * * * ** * * ********** * ******* * * * * * *** ******* * *** * ******* *** *** * * * * * * * * * * ***** ********* * * * * **** * * * * * **** * * ****** * * * * * * * * * * * ******* * * * * * ** **** ******* * * * * * * * * * * *** * * * * * * * * ******* * * * ** * * ******* * * * * **** * * ** * * * * * * * * * * * * * * * * * * * * * * * *** * * * * * * *A * * * * * * * * * * * * * * * ***** ************** *********** * * * * * * * * * **** * * * * * * * ***** * * ***** * * * * * * * * * * * * * * * * * * * * ** * *************************** * * ***** * * * * ******** * * * * * * ******* *** ***** * * * * * * * * * * * * * * * *D * **** * * * * * ********* ********* ************ * ****************************** *** * * * * * * * * * * * * * * * * * * **** * * ****** ************** * ******** * * ****************************** * * * * * * * * * * * * * * * * * * * * * * * ** ******** ************** * * * ******** *********** * * *********** ****** * * * * * * * * * **************************************************************************************** ===== Objectif ===== Produire un fichier texte contenant le labyrinthe et sa solution. La solution est affichée en utilisant le caractère ''%%.%%'' pour marquer les cases du chemin à suivre. Voici un exemple : ******************* *D* *A...* *.******** ******.* *.................* ******************* ===== Aide ===== ==== Ouverture de fichier ==== file = open('le_nom_du_fichier_source', 'r', encoding='utf8') # 'r': ouverture en mode lecture # 'utf8': précise l'encodage des caractères. # inutile ici car aucun caractère spécial. texte = file.read() # texte contient la totalité du contenu du fichier # autre possibilité : lines = file.readlines() # lines contient un tableau dont chaque item est une ligne du fichier file.close() # ne pas oublier de libérer le fichier Vous pouvez ensuite poursuivre en travaillant sur ''%%texte%%'' ou sur ''%%lines%%'' selon le choix fait. ==== Écriture du fichier ==== En supposant que la variable ''%%texte%%'' contient le texte à écrire dans le fichier, file = open('le_nom_de_fichier_cible', 'w', encoding='utf8') # 'w': écriture file.write(texte) file.close() ==== Méthode ==== Une possibilité est de créer un arbre : * Le point de départ est la racine de l'arbre, * chaque fois qu'on analyse un nœud, on considère toutes les cellules voisines non encore visitées que l'on ajoute comme enfant du nœud en cours, * à partir du nœud racine on fait un parcours en largeur ou en profondeur -- à vous de voir lequel est le mieux * quand on visite la cellule d'arrivée, il suffit de remonter l'arbre jusque la racine : c'est le bon chemin. ===== Des améliorations ==== On peut ajouter des complications : * Tenir compte d'un temps de parcours qui peut varier selon les cellules, par exemple des cellules pourraient être plus difficiles à parcourir et occasionner une pénalité. On pourrait choisir un symbole pour de telles cellules. * Certains passages pourraient être en sens unique. * Le labyrinthe pourrait se décomposer en plusieurs étages avec des ascenseurs entre les étages. * On peut donner au labyrinthe une représentation graphique dans un module comme tkInter.