TP - Version 1☘
Dans une grille de dimensions n
× m
, dont chaque case contient un
nombre, on part de la case (0, 0)
et on se rend dans la case (n-1, m-1)
.
Les seuls déplacements autorisés sont les déplacements vers la droite et vers
le bas.
On souhaite emprunter le chemin pour lequel la somme des nombres rencontrés est la plus grande.
Exemple☘
On considère la grille ci-dessous :
3 | 3 | 6 | 2 | 3 | 3 | |
8 | 9 | 3 | 4 | 8 | 7 | |
7 | 7 | 9 | 5 | 9 | 7 | |
3 | 4 | 2 | 4 | 1 | 6 |
Un manière optimale de résoudre ce problème en plusieurs étapes est de choisir, à chaque étape (donc à chaque case), la solution qui semble la meilleure, c'est-à-dire la case suivante qui contient la plus grande valeur.
Ainsi, avec la grille précédente :
-
À partir de la case
(0, 0)
, on a le choix entre les nombres 3 à droite et 8 en bas. Il est préférable de descendre :
3 3 6 2 3 3 8 9 3 4 8 7 7 7 9 5 9 7 3 4 2 4 1 6 -
À partir de la case
(1, 0)
, on a le choix entre les nombres 9 à droite et 7 en bas. Il est préférable d'aller à droite :
3 3 6 2 3 3 8 9 3 4 8 7 7 7 9 5 9 7 3 4 2 4 1 6 -
À partir de la case
(1, 1)
, on a le choix entre les nombres 3 à droite et 7 en bas. Il est préférable de descendre :
3 3 6 2 3 3 8 9 3 4 8 7 7 7 9 5 9 7 3 4 2 4 1 6 -
etc... jusqu'à arriver à la case en bas à droite de cette grille :
3 3 6 2 3 3 8 9 3 4 8 7 7 7 9 5 9 7 3 4 2 4 1 6
Le chemin optimal a donc pour somme 63.
Partie A - Application manuelle☘
Sur un cahier, recopiez la grille ci-dessous puis indiquez le chemin permettant d'obtenir la somme maximale ainsi que la valeur de cette somme.
1 | 8 | 7 | 8 | 4 | 1 | |
7 | 3 | 6 | 5 | 3 | 9 | |
5 | 8 | 5 | 1 | 5 | 7 | |
3 | 9 | 4 | 1 | 3 | 8 |
Appelez l'enseignant pour lui faire part de votre raisonnement.
Partie B - Programmation☘
Programmez le raisonnement précédent en copiant, collant et complétant le code
de la fonction somme_maxi()
dont le paramètre grille
est un tableau de
tableaux contenant chacun le même nombre d'entiers.
Pour une grille passée en paramètre, ce tableau renvoie la somme obtenue en
se déplaçant d'une case à la suivante en bas ou à droite. Le choix s'effectue
selon la case ayant la plus grande valeur.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Une piste
Nommer ligne
la ligne de la case « en cours » et colonne
sa colonne.
Alors la case de coordonnées (ligne, colonne)
est grille[ligne][colonne)]
.
Une autre piste
Traiter séparément le cas de la dernière ligne ou de la dernière colonne car un seul déplacement est alors possible au lieu de deux.
Encore une piste
Lorsqu'on est sur une case quelconque de coordonnées (ligne, colonne)
,
alors on se déplace sur la case contenant la plus grande valeur entre
celle de coordonnées (ligne+1, colonne)
et celle de coordonnées
(ligne, colonne+1)
.
Une dernière piste
On pose ligne = 0
et colonne = 0
.
On se place sur la case (ligne, colonne)
.
Tant que ligne
et colonne
n'ont pas toutes les deux la dernière valeur
possible, Alors :
-
si la
ligne
a la dernière valeur possible, on ne va qu'à droite en augmentantcolonne
de 1 ; -
si la
colonne
a la dernière valeur possible, on ne va qu'en bas en augmentantligne
de 1 ; -
si la case à droite a une valeur plus grande que celle d'en bas, on va à droite en augmentant
colonne
de 1 ; -
si la case en bas a une valeur plus grande que celle de droite, on va en bas en augmentant
ligne
de 1.
Partie C - Plus grande somme ?☘
En fait, cette méthode ne donne pas toujours le chemin de somme maximale.
Dessinez sur votre cahier un tableau pour lequel le raisonnement développé dans ce TP ne donne pas un chemin de somme maximal.