Un simple parcours en profondeur convient. pour pouvoir une fois la sortie trouvée reconstruire le chemin qui évite les culs-de-sac, il faut en plus garder un fil d'ariane qui permet de remonter directement de la sortie vers l'entrée (rechercher ses amis et les sauver). Pour cela on garde pour chaque carrefour (noeud) un pointeur arrière vers le carrefour d'où l'on vient.
Le plus court chemin peut être trouvé de façon similaire par un parcours du graphe en largeur ou plus généralement avec une file de priorité.
Concrètement, on pourra dessiner le labyrinthe comme un damier, et le construire en en cliquant sur les cases noires à blanchir. Pour éviter les cas particuliers aux bords, on pourra simplement imposer que les bords du damier restent toujours noires.
Par contre il est plus commode de calculer sur une structure de graphe régulière (simple tableau de sommets). Ce que l'on réalise facilement en numérotant les cases. Le labyrinthe est donc représenté par un tableau de S cases contigües noires ou blanches selon qu'il est possible de se déplacer dessus. L'état d'une case doit être simultanément mémorisé dans le tableau et dessiné à l'écran.
typedef enum {Interdit = 0, Depart = 1, Sortie = 2, Libre = 3} Etat;
void change_etat (Sommet x, Etat m)qui modifie l'état du noeud x et colorie la case correspondante dans la bonne couleur. (L'utilisation de change_etat garantit la cohérence entre la représentation abstraite et le dessin du labyrinthe).
On pourra utiliser le fichier graphique.c dont l'interface est graphique.h.
Il suffit pour cela de copier les deux fichiers dans le dossier courant, d'ajouter
#include "graphique.h"en entête du programme, et de compiler avec
gcc -Wall -o labyrinthe graphique.c labyrinthe.c -lX11 -lMacLib
1 0 x 2 3Écrire une fonction
Sommet fils (Sommet x, int k);qui retourne le k-ième fils du sommet x
void retrouve_les_parents (Sommet x)qui trace le chemin inverse menant d'un noeud a ses parents (en utilisant les annotations).
void cherche_la_sortie (Sommet x)