Algorithmique & Programmation
Semestre 2 ST

Matrices de variables
Cours TD - Corrections TP

Exercice n°1

On considère une matrice d'entiers composée de 20 lignes de 8 colonnes. On souhaite effectuer diverses recherches au sein de ce tableau.

a) Développer un sous-algorithme permettant de calculer la plus petite valeur contenue dans un tel tableau.

b) Développer un sous-algorithme permettant de calculer la position de la plus petite valeur contenue dans un tel tableau.

c) Développer un sous-algorithme permettant de calculer l'indice de la ligne dont la somme des valeurs est la plus grande.

ManipulationsMatriceEntier.lda

constante N : entier <- 20
constante M : entier <- 8

{ Type agrege de stockage d'une position      }
  
structure position
    l : entier <- 0
    c : entier <- 0
fin structure

{ Methode de recherche la plus petite valeur  }
{ contenue dans une matrice de entier         }

entier fonction min(t)
  Données
    t : Tableau [N][M] de entier
  Locales
    min : entier
    i : entier
    j : entier
  min <- t[0][0]
  pour i de 0 à N-1 faire
    pour j de 0 à M-1 faire
      si t[i][j] < min alors
        min <- t[i][j]
      fsi
    fait
  fait
  retourner min
fin fonction

{ Methode de recherche des coordonnees        }
{ de la plus petite valeur                    }
{ contenue dans une matrice de entier         }
  
position fonction positionMin(t)
  Données
    t : Tableau [N][M] de entier
  Locales
    min : entier
    i : entier
    j : entier
    pMin : position
  min <- t[0][0]
  pour i de 0 à N-1 faire
    pour j de 0 à M-1 faire
      si t[i][j] < min alors
        pMin.l <- i
        pMin.c <- j
        min <- t[i][j]
      fsi
    fait
  fait
  retourner pMin
fin fonction

{ Methode de calcul de la somme des valeurs   }
{ contenues dans un tableau de entier         }

entier fonction sommeLigne(ligne)
  Données
    ligne : Tableau [M] de entier
  Locales
    somme : entier
    i : entier
  somme <- 0
  pour i de 0 à M-1 faire
    somme <- somme+ligne[i]
  fait
  retourner somme
fin fonction

{ Methode de calcul de l'indice de la ligne   }
{ de somme maximum des lignes                 }
{ contenues dans une matrice de entier        }

entier fonction ligneMax(t)
  Données
    t : Tableau [N][M] de entier
  Locales
    max : entier
    i : entier
    iMax : entier
    somme : entier
  max <- sommeLigne(t[0])
  iMax <- 0
  pour i de 1 à N-1 faire
    somme <- sommeLigne(t[i])
    si somme > max alors
      iMax <- i
      max <- somme
    fsi
  fait
  retourner iMax
fin fonction

Clavier.class - Ecran.classExemple d'exécution

Exercice n°2

On manipule des matrices de réels.

a) Développer un sous-algorithme permettant de copier une matrice NxM dans une matrice NxM.

b) Développer un sous-algorithme permettant de copier la matrice transposée d'une matrice NxM dans une matrice MxN. Transposer une matrice est l'opération consistant à permuter ses valeurs autour de la diagonale.

c) Développer un sous-algorithme permettant de réaliser la transposition d'une matrice NxN. La transposition est à réaliser en "en place", sans utilisation d'une matrice auxiliaire.

ManipulationsMatriceReel.lda

constante N : entier <- ...
constante M : entier <- ...

{ Methode de copie d'une matrice de reel      }
{ dans une matrice de reel supposee           }
{ de taille identique                         }
  
action copie(src,dst)
  Données
    src : Tableau [N][M] de réel
  Résultat
    dst : Tableau [N][M] de réel
  locales
    i : entier
    j : entier
  pour i de 0 à N-1 faire
    pour j de 0 à M-1 faire
      dst[i][j] <- src[i][j]
    fait
  fait
fin action

{ Methode de transposition d'une matrice      }
{ de reel dans une matrice de reel            }
{ supposee de taille compatible               }
  
action transposition(src,dst)
  Données
    src : Tableau [N][M] de réel
  Résultat
    dst : Tableau [M][N] de réel
  locales
    i : entier
    j : entier
  pour i de 0 à N-1 faire
    pour j de 0 à M-1 faire
      dst[j][i] <- src[i][j]
    fait
  fait
fin action

{ Methode de transposition d'une matrice      }
{ carree de reel                              }
  
action transposition(m)
  Données / Résultats
    m : Tableau [N][N] de réel
  locales
    i : entier
    j : entier
    aux : réel
  pour i de 0 à N-2 faire
    pour j de i+1 à N-1 faire
      aux = m[i][j]
      m[i][j] = m[j][i]
      m[j][i] = aux
    fait
  fait
fin action

Clavier.class - Ecran.classExemple d'exécution

Exercice n°3

On considère une matrice de NxM "cellules". Chaque cellule possède 4 cellules voisines (à droite, à gauche, en haut et en bas). Un déplacement élémentaire entre cellules ne peut être réalisé qu'entre deux cellules voisines. La "distance" existant entre deux cellules est le nombre minimum de déplacements élémentaires permettant de passer de la première cellule à la seconde.

a) Développer un sous-algorithme permettant de calculer la matrice des distances existant entre chaque cellule d'une matrice NxM et une cellule de position arbitraire.


Pour une matrice de 14 lignes de 20 colonnes et la position départ (8,5)

On considère que la matrice de taille NxM est une matrice de booléens. Cette matrice représente un plateau de jeu définissant 2 territoires (vrai pour le joueur n°1, faux pour le joueur n°2).


Exemple de plateau de jeu

b) Développer un sous-algorithme permettant de calculer la matrice des distances existant entre chaque cellule d'une matrice NxM et une cellule de position arbitraire. Dans cette version, le passage par une cellule du territoire du joueur opposé au joueur auquel appartient la cellule de départ est interdit. Une distance égale à -1 signifie une cellule non atteignable.


Distances à partir de la position initiale (8,5)


Distances à partir de la position initiale (1,8)

ParcoursMatrice.lda

constante N : entier <- ...
constante M : entier <- ...

Tableau [N][M] de entier fonction matriceDesDistances(px,py)
  Données
    px : entier
    py : entier
  Locales
    i : entier
    j : entier
    md : Tableau [N][M] de entier
  pour i de 0 à N-1 faire
    pour j de 0 à M-1 faire
      md[i][j] <- abs(i-py)+abs(j-px)
    fait
  fait
  retourner md
fin fonction

booleen fonction voisin(x,y,md,distance)
  Données
    x : entier
    y : entier
    md : Tableau [N][M] de entier
    distance : entier
  Locales
    res : booleen
  res <- faux
  si ( x >= 0 ) et ( x < M ) et ( y >= 0 ) et ( y < N ) alors
    si md[y][x] = distance alors
      res <- vrai
    fsi
  fsi
  retourner res
fin fonction

booleen fonction voisinage(c,l,md,distance,t,v)
  Données
    c : entier
    l : entier
    md : Tableau [N][M] de entier
    distance : entier
    t : Tableau [N][M] de booleen
    v : booleen
  Locales
    res : booleen
  res <- faux
  si ( md[l][c] = -1 ) et ( t[l][c] = v ) alors
    si voisin(c+1,l,md,distance) alors
      res <- vrai
      sinon
      si voisin(c-1,l,md,distance) alors
        res <- vrai
        sinon
        si voisin(c,l+1,md,distance) alors
          res <- vrai
          sinon
          si voisin(c,l-1,md,distance) alors
            res <- vrai
          fsi
        fsi
      fsi
    fsi
  fsi
  retourner res
fin fonction

Tableau [N][M] de entier fonction distances(px,py,t)
  Données
    px : entier
    py : entier
    t : Tableau [N][M] de booleen
  Locales
    i : entier
    j : entier
    l : entier
    c : entier
    change : booleen
    distance : entier
    md : Tableau [N][M] de entier
  distance <- 0
  pour i de 0 à N-1 faire
    pour j de 0 à M-1 faire
      md[i][j] <- -1
    fait
  fait
  md[py][px] <- 0
  faire
    change <- faux
    pour l de 0 à N-1 faire
      pour c de 0 à M-1 faire
        si voisinage(c,l,md,distance,t,t[py][px]) alors
          change <- vrai
          md[l][c] <- distance+1
        fsi
      fait
    fait
    distance <- distance+1
  tant que (change)
  retourner md
fin fonction

Clavier.class - Ecran.classExemple d'exécution