TD 7 : Tableaux à deux dimensions (tableaux 2D)#
Exercice 1 : Échauffement
On considère le tableau d’entiers à deux dimensions suivant :
vector<vector<int>> t={{7, -1, 4, 3}, {15, 11, 17, 12}, {20, 34, 42, 25}};
Quelles sont les valeurs
t[0][0]
,t[0][1]
,t[2][3]
?Donnez le nombre de lignes et de colonnes du tableau
t
.
Exercice 2 : Déclaration, allocation et initialisation de tableau 2D
Écrire un fragment de programme qui construit un tableau 2D résultat
de L
lignes et C
colonnes et qui l’initialise avec un entier v
dans chaque case (on supposera L
, C
et v
prédéfinis).
Exercice 3 : Opérations sur tableaux à deux dimensions
Dans cet exercice on considère des tableaux de caractères à deux
dimensions. Par exemple l’un des tableaux respectivement carré tc
,
rectangulaire tr
ou quelconque tq
définis comme suit :
vector<vector<char>> tc = { {'P','o','u','r'}, {'b','i','e','n'}, {'r','i','r','e'}, {'l','i','s','!'} };
vector<vector<char>> tr = { {'B','r','a','v','o'}, {'b','o','n','n','e'}, {'A','N','N','E','E'} };
vector<vector<char>> tq = { {'T','o','u','t'}, {'v','a'}, {'m','i','e','u','x'} };
Pour chaque opération ci-dessous, spécifiez et implantez une fonction qui la réalise (ces fonctions prendront en paramètre un tableau à deux dimensions t
, et éventuellement d’autres paramètres) :
renvoyer le nombre de lignes de
t
.renvoyer le nombre de colonnes de
t
(supposé rectangulaire).afficher les éléments de la ligne d’indice \(\ell\) de
t
.afficher les éléments de la colonne d’indice \(c\) de
t
(supposé rectangulaire).afficher les éléments de la diagonale de
t
(supposé carré).afficher les éléments de
t
; pourt=tc
,tr
ettq
, les affichages seraient respectivement :Pour Bravo Tout bien bonne va rire ANNEE mieux lis!
indiquer si oui ou non,
t
contient le caractèrec
.
Exercice 4 : Matrices
Pour être plus spécifique et éviter d’avoir à écrire
vector<vector<int>>
à tout bout de champ, on peut définir un
raccourci. Dans les questions suivantes, qui traitent de matrices, on
utilisera par exemple le raccourci suivant :
using Matrice = vector<vector<int>>;
Les deux constructions suivantes sont alors totalement équivalentes :
vector<vector<int>> tab = { {1,2,3}, {4,5,6}, {7,8,9} };
Matrice tab = { {1,2,3}, {4,5,6}, {7,8,9} };
Spécifiez et implantez une fonction pour chacune des questions suivantes :
teste si un tableau carré est symétrique, i.e. si \(T_{i, j} = T_{j, i}\) pour tous \(i\) et \(j\).
\(\clubsuit\) teste si une matrice est carrée et symétrique.
calcule la somme de deux matrices (supposées de mêmes dimensions). On vous rappelle que la somme de deux matrices \(T\) et \(T'\) est une matrice \(C\), où \(C_{i,j}=T_{i,j}+T'_{i,j}\) pour tous \(i\) et \(j\).
\(\clubsuit\) calcule le produit de deux matrices. On vous rappelle que le produit de deux matrices \(T\) et \(T'\) est une matrice \(C\), où \(C_{i,j}=T_{i,1}T'_{1,j}+ T_{i,2}T'_{2,j} + \cdots\).
Exercice 5 : Réservation de salle
Une salle de réunion peut être utilisée par les employés d’une
entreprise. La réservation se fait par plages d’une heure, de 8h00 à
19h00, chaque plage horaire commençant à l’heure pile; par exemple, il
y a une plage 9h00-10h00 mais il n’y a pas de plage 9h15-10h15. Le
planning hebdomadaire de la salle est modélisé par un tableau de
booléens à deux dimensions: cinq lignes correspondant aux cinq jours
de la semaine, onze colonnes correspondant aux onze plages horaires de
la journée. La valeur pour un jour et une plage horaire donnée est
true
si la salle est réservée sur cette plage horaire, et false
si
elle est libre. On suppose pour la suite de l’exercice avoir accès au
tableau suivant :
vector<string> jours = {"lundi", "mardi", "mercredi", "jeudi", "vendredi"};
Écrivez une fonction qui construit un planning vide.
Écrivez une fonction qui prend en paramètre le planning de réservation d’une salle et qui l’affiche de façon intelligible :
avec des phrases (par exemple : salle réservée le mardi de 9h00 à 10h00).
\(\clubsuit\) sous la forme d’une grille jour / plage horaire, où le mot «Réservée» figure dans les cases concernées.
Écrivez une fonction, avec son test, qui calcule le taux d’occupation d’une salle, c’est à dire le nombre de plages réservées divisé par le nombre total de plages.
Exercice 6 : \(\clubsuit\) Le jeu du démineur
L’objectif de cet exercice est de réaliser une version simple du jeu du «démineur». Le but est de localiser des mines cachées dans un champ virtuel avec pour seule indication le nombre de mines dans les zones adjacentes.
Plus précisément, le champ consiste en une grille rectangulaire dont chaque case contient ou non une mine. Au départ, le contenu de chaque case est masqué. À chaque étape, l’utilisateur peut :
Démasquer le contenu d’une case; s’il y a une mine, « BOUM! », il a perdu. Sinon, le nombre de cases adjacentes (y compris en diagonale) contenant une mine est affiché.
Marquer une case, s’il pense qu’elle contient une mine.
L’utilisateur a gagné lorsqu’il a démasqué toutes les cases ne contenant pas de mine.
Pour représenter en mémoire l’état interne de la grille, on utilisera
un tableau à deux dimensions de caractères (type
vector<vector<char>>
). On utilisera les conventions suivantes pour
représenter l’état d’une case :
“m”: présence d’une mine, “M”: présence d’une mine, case marquée;
“o”: absence de mine, “O”: absence de mine, case marquée;
“ “: absence de mine, case démasquée.
Afin d’éviter d’avoir à écrire vector<vector<char>>
à tout bout de
champ on utilise un raccourci :
using GrilleDemineur = vector<vector<char>>; // tableau 2D de caractères
Implantez une fonction permettant de compter le nombre total de mines (marquées ou pas) dans une grille.
Implantez une fonction permettant de tirer au hasard une grille initiale. On supposera fournie une fonction
bool boolAleatoire()
renvoyant un booléen tiré au hasard.Implantez une fonction permettant de tester si une grille est gagnante.
Implantez une fonction permettant de compter le nombre de mines dans les cases adjacentes à une case donnée d’une grille.
Implantez une fonction permettant de renvoyer une chaîne de caractères représentant la grille telle que doit la voir le joueur.