TP : Les files 1 Le module Queue 2 Retour sur le coloriage

publicité
Univ. Lille1 - Licence Informatique 2ème année
2011-2012
Algorithmes et Programmation Impérative 2
TP : Les les
Objectifs : Travailler sur les les.
1 Le module
Queue
Le module Queue de la bibliothèque standard d'Objective Caml, dénit un type le nommé
permettant de manipuler des les contenant tout type de valeurs.
Le tableau 1 donne les correspondances entre les noms des fonctions de ce module et le nom des
opérations primitives décrites en cours et réalisées dans notre module File.
Queue.t
File
type ’a file
exception File_vide
val creer : unit -> ’a pile
val enfiler : ’a -> ’a file -> unit
val defiler : ’a file -> ’a
val sommet : ’a file -> ’a
val est_vide : ’a file -> bool
Queue
type ’a t
exception Empty
val create : unit -> ’a t
val add : ’a -> ’a t -> unit
val take : ’a t -> ’a
val top : ’a t -> ’a
val is_empty : ’a t -> bool
Table 1 Correspondances entre module File et module Queue
La documentation complète de ce module se trouve ici.
Question 1 Reprenez l'exercice 1 de la feuille d'exercices no 5 en l'adaptant aux fonctions du module
Queue.
Question 2 Réalisez une procédure d'impression des les d'entiers. Cette procédure se nommera
imprimer_file. Elle ne doit pas modier le contenu de la le.
2 Retour sur le coloriage
On revient maintenant sur le problème du coloriage abordé dans un TP précédent.
L'algorithme récursif présenté dans ce TP peut être présenté en version itérative (on dit qu'on
le dérécursive ) en utilisant une le.
On remplace les appels récursifs par des enlements de points à colorier (la le est alors une le
de couples d'entier).
Question 3 Réalisez une procédure de coloriage suivant cet algorithme.
Question 4 Étudiez l'inuence de l'ordre dans lequel vous enler les voisins à colorier.
Y a-t-il un ordre avec lequel le coloriage s'eectue comme pour la version récursive ?
1
Algorithme 0.1 Coloriage avec le
Entrée : un point (i, j) intérieur à une région à colorier
Sortie : colorie la région
créer une le f
enler le point (i, j) dans f
tant que f n'est pas vide faire
colorier le point en tête de la le f
déler la le f
enler les voisins non coloriés dans f
n tant que
3 Inondation d'une région
On souhaite simuler l'inondation d'un terrain à partir d'un point donné de ce terrain. Un terrain
est constitué de parcelles à des altitudes diérentes (entre 0 et 255). En versant de l'eau en un point
du paysage on suhaite observer la propagation de celle-ci.
Il est possible de réaliser la simulation des écoulements de l'eau grâce à un algorithme qui
utilise des les. Il y a autant de les qu'il y a d'altitudes possibles (donc 256), notons fi ces les.
L'algorithme procède en phases successives. Chaque le contient les parcelles qui vont être inondées
au tour suivant.
Supposons avoir le paysage suivant constitué de deux cuvettes et d'une colline les séparant. Plus
le niveau de gris est élevé et plus l'altitude est faible. On a donc ici trois niveaux d'altitude, le
noir représentant l'altitude la plus faible. On choisit d'inonder la cuvette de gauche. La cuvette se
remplira puis une fois remplie inondera la cuvette de droite.
L'algorithme se déroule de la manière suivante si l'inondation débute à partir d'une parcelle
d'altitude a :
1. ajouter la parcelle à la le fa , noter fa comme étant une parcelle inondée,
2. pour toute les altitudes a considérées dans l'ordre croissant
pour chaque parcelle de la le fa
inonder la parcelle
pour chaque parcelle voisine, l'ajouter à la le correspondant à son altitude si elle est
plus grande que a, à la le fa sinon
2
3.1
A votre disposition
An de visualiser la simulation d'inondation, nous vous proposons une interface graphique qui
permet de dessiner une région. Ce sera à vous de colorier les cases inondées.
On donne trois modules :
1. Le module Parcelle permet de représenter une parcelle (voir la documentation ici).
2. Le module Terrain permet de représenter un terrain et notamment d'en créer un de manière
aléatoire (voir la documentation ici).
3. Le module Dessin qui fournit une procédure de dessin d'un terrain (voir la documentation
ici).
Question 5 Récupérez le chier materiel.zip et décompressez-le dans votre répertoire de travail.
Vous devez obtenir 6 chiers et un dossier.
Question 6 Compilez les 6 chiers sources dans l'ordre des dépendances.
Pour utiliser un interpréteur avec ces modules, tapez la commande
> ocaml graphics.cma parcelle.cmo terrain.cmo dessin.cmo
Pour compiler un chier source utilisant ces modules an de produire un programme exécutable,
tapez la commande
> ocamlc graphics.cma parcelle.cmo terrain.cmo dessin.cmo \
-o <nom_executable> <fichier_source>
Question 7 Testez les modules Terrain et Dessin en dessinant un terrain de taille 257 × 257. Essayez
une colline, puis une cuvette, puis un terrain au relief aléatoire.
3.2
Le travail à faire
Question 8 Créez une fonction permettant de lister les voisins non encore inondés d'une parcelle d'un
terrain.
Question 9 Créez un tableau de les et ajoutez une parcelle tirée au hasard dans la le correspondante.
Question 10 Réalisez une fonction inonder de type
Terrain.terrain → int → int → unit
qui inonde un terrain depuis le point dont les coordonnées sont passées en paramètre.
3
Téléchargement