TP3 : génération de labyrinthes

Le but de ce TP est de comparer différentes manières de générer un labyrinthe intéressant sur une grille rectangulaire.

On peut, en première approximation, représenter un labyrinthe sur une telle grille par un arbre : une pièce est reliée à une pièce voisine (graphe non-orienté) s'il y a une ouverture entre les deux. Le fait de prendre un arbre permet de garantir les deux propriétés suivantes :

On pourrait considérer des labyrinthes plus généraux, mais cette restriction suffira pour le TP...

L'archive contenant les fichiers necessaires pour le TP se trouve ici : http://www.lama.univ-savoie.fr/~hyvernat/Enseignement/0809/info505/tp.tgz .

Préliminaires

Les fichiers graphes.h et graphes.c (les mêmes que pour les TP précédents) contiennent les structures de base pour les graphes. Vous pourrez continuer à les utiliser...

Vous disposez en plus de deux fichiers labyrinthes.h et labyrinthes.h qui contiennent des définitions supplémentaires :

Affichage

Écrivez la fonction de prototype void afficheGrille(GrapheListe) qui affiche un graphe sous forme de labyrinthe dans une grille.

Le graphe doit comporter exactement LARGEUR * HAUTEUR sommet, et ne doit avoir que des arêtes entre des sommets k et :

(Modulo les bords de la grille bien entendu...)

Voici un exemple d'affichage pour un labyrinthe intéressant :

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|              |        |        |     |  |        |     |  |     |
+--+--+  +--+  +--+  +  +  +--+  +  +  +  +--+  +--+--+  +  +  +  +
|           |  |     |        |  |  |     |        |           |  |
+  +  +  +  +--+--+--+--+  +  +  +--+--+  +--+  +--+  +  +--+--+--+
|  |  |  |     |           |  |  |  |        |  |     |           |
+--+--+--+--+  +  +--+--+--+--+  +  +  +  +--+  +--+  +  +--+  +--+
|  |                    |     |        |  |           |  |        |
+  +--+  +  +--+--+--+--+  +  +--+--+  +  +--+--+  +--+--+  +--+  +
|        |     |           |  |        |  |        |     |     |  |
+  +--+--+--+  +  +--+  +  +--+--+  +--+  +--+  +  +--+  +  +  +  +
|  |     |     |  |     |     |  |  |           |     |  |  |  |  |
+  +  +--+--+  +  +  +  +  +--+  +  +  +--+  +  +--+  +  +--+  +--+
|  |              |  |  |     |     |  |     |     |  |           |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

Note:
Pour ceux qui le souhaite, la fonction d'affichage est disponible dans le fichier affiche.c .

Génération de labyrinthes

Utilisation du parcours en largeur

Écrivez une fonction qui utilise un parcours en largeur pour calculer un arbre couvrant d'une grille pleine (et donc un labyrinthe). Pour faire ceci, vous pouvez soit utiliser la variante avec les tableaux, ou la variante avec la file en utilisant le type Tile.

Pour pouvoir afficher le labyrinthe directement, vous remplacerez le tableau pere par un GrapheListe vide, auquel vous rajouterez les arêtes parcourues.

Utilisation du parcours en profondeur

Écrivez une fonctions qui utilise le parcours en profondeur pour calculer un arbre couvrant d'une grille pleine.

Testez et comparez les labyrinthes obtenus par cette méthode et la méthode précédente.

Utilisation d'un arbre couvrant de poids minimal

Lors des des parcours précédents, l'aléatoire du labyrinthe venait du fait que l'ordre des sommets dans les listes d'adjacence était aléatoire.

Comme les grilles pleines contiennent des arcs de poids aléatoire, une autre manière d'obtenir un labyrinthe est de chercher un arbre couvrant de poids minimal.

Utilisez l'algorithme de Kruskal (ou de Prim, au choix) pour chercher un tel arbre couvrant, et affichez le.

Comparez les labyrinthes obtenus par les 3 méthodes...

Résolution de labyrinthes (BONUS)

Étant donné un sous graphe de la grille pleine, écrivez une procédure qui teste si l'on peut aller d'une case (a,b) vers une case (c,d). Si un tels chemin existe, affichez le labyrinthe avec une solution optimale.

Généré le Wed Dec 10 15:15:46 2008 par  doxygen 1.5.5