TD 14 - Matrice et file
1 k-voisinage
1.1 Exercice 1 : Algorithme du \(k\)-voisinage dans une matrice
On considère une matrice \(M\) à \(n\) lignes et \(m\) colonnes, indexée de \(1\) à \(n\) pour les lignes et de \(1\) à \(m\) pour les colonnes.
Donner le 3-voisinage de la case (4,2) dans cette matrice (les cases grises représentent des obstacles) :
Grille 7×7 avec case rouge en (4,2) Obstacles en : (2,3), (2,4), (2,5), (3,5), (4,1), (4,5), (5,2), (6,6), (7,3)Écrire un algorithme en pseudo-code qui reçoit en entrée :
- La matrice \(M\) avec les dimensions \(n\) (nombre de lignes) et \(m\) (nombre de colonnes),
- les coordonnées \((i,j)\) d’une case de la matrice,
- un entier \(k\geq 1\),
et qui affiche toutes les coordonnées des cases du \(k\)-voisinage de \((i,j)\) (c’est-à-dire toutes les cases \((x,y)\) atteignables à partir de \((i,j)\) en \(k\) déplacements).
Le k-voisinage d’une case \((i,j)\) est l’ensemble de toutes les cases atteignables en exactement \(k\) déplacements en utilisant les 4 directions (haut, bas, gauche, droite).
Distance de Manhattan : \(d((i,j), (x,y)) = |i-x| + |j-y|\)
Le k-voisinage contient toutes les cases à distance de Manhattan égale à \(k\).
Exemple pour k=1 : - Case \((3,3)\) : voisins = {(2,3), (4,3), (3,2), (3,4)}
Exemple pour k=2 : - Case \((3,3)\) : 8 voisins formant un losange
Utiliser une file pour un parcours en largeur (BFS) : 1. Enfiler la case de départ avec distance 0 2. Pour chaque case défilée : - Si distance = k : ajouter au résultat - Sinon : enfiler les voisins non visités avec distance+1 3. Continuer jusqu’à ce que toutes les cases de distance ≤ k soient visitées
2 En plus
2.1 Exercice 2 : Propagation sur une grille 2D 🏠
On considère une grille 2D composée de nombres entiers positifs.
L’origine, c’est-à-dire la case de coordonnées \((1,1)\), est située en haut à gauche.
Objectif : Écrire un algorithme Propagation(M, x, y) qui prend en paramètres la matrice M, et les coordonnées \((x, y)\) d’une case (lignes, colonnes) et effectue la propagation suivante :
- On enfile les cases à une distance de 1 de la case \((x, y)\), puis de 2, de 3 jusqu’à rencontrer une case qui contient 0. (Attention : on enfile qu’une seule fois chaque case)
- On soustrait \(1\) à tous ces k-voisins de la case \((x, y)\).
Exemple (Transformation de la grille avec Propagation(M, 1, 4)) :
Avant : Après :
|0 0 0 1 2 0 0| |0 0 0 0 1 0 0|
|0 0 2 3 2 1 0| |0 0 1 2 1 0 0|
|1 0 1 2 2 2 2| -Prop-> |1 0 0 1 1 1 1|
|0 0 0 1 0 0 1| |0 0 0 0 0 0 0|
|0 0 0 0 0 0 0| |0 0 0 0 0 0 0|
|1 1 0 3 1 2 0| |1 1 0 3 1 2 0|
- Proposez un algorithme
Propagation(M, x, y)en pseudo-code
- BFS depuis (x,y) : enfiler les voisins niveau par niveau
- Condition d’arrêt : s’arrêter quand on rencontre un 0
- Modification : décrémenter de 1 chaque case visitée
- Marquer les visités : utiliser une matrice booléenne pour éviter de revisiter
Complexité : \(O(n \times m)\) dans le pire cas (toute la grille)