Sujet n° 14 · Session 2026 · 1 heure
Évacuer une pièce
Combien de sorties faut-il, et où, pour vider une salle rapidement ? Le candidat complète une simulation sur grille : compter les occupants, enchaîner les alertes, ajouter des portes, puis réparer le choix de la sortie la plus proche.
- Programmation objet
- Liste de listes
- Boucle while
- Distance de Manhattan
- Débogage
Mise en situationLa pièce
La pièce est une instance de la classe Piece, dont le constructeur définit la profondeur et la largeur. La méthode ajouter_occupants(self, i, j, nb) ajoute jusqu'à nb occupants dans la case située ligne i et colonne j, sachant que le nombre d'occupants d'une case est obligatoirement compris entre 0 et 5. La méthode ajouter_sortie(self, direction, position) ajoute une sortie, mais seules les directions "N" (nord) et "O" (ouest) sont pour l'instant prises en compte. À l'affichage, les sorties sont représentées par la lettre P.
p1 = Piece(5, 7)
p1.ajouter_occupants(2, 0, 4)
p1.ajouter_occupants(3, 4, 1)
p1.ajouter_occupants(0, 5, 2)
p1.ajouter_sortie("N", 5)
print(p1)
P
[0, 0, 0, 0, 0, 2, 0]
[0, 0, 0, 0, 0, 0, 0]
[4, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 0, 0]
[0, 0, 0, 0, 0, 0, 0]
La méthode alerter simule une alerte : chaque occupant essaie de se rapprocher d'une sortie en se déplaçant d'une case (vers le nord, le sud, l'est ou l'ouest) ; chaque sortie ne laisse passer qu'une seule personne par alerte. Il n'est pas nécessaire de comprendre ni de modifier son code.
Le fichier IHM_evacuation.py ouvre une interface graphique (tkinter) pour tester la simulation. Elle ne fonctionne pas dans le navigateur : elle se lance depuis les fichiers de départ, sur l'ordinateur.
Toutes les cellules de cette page partagent le même Python, comme un notebook : une fonction écrite à une question sert aux suivantes. Maj + Entrée exécute la cellule.
Pour l'examinateur
Les durées d'évacuation des tests fournis ne dépendent pas du hasard : 11, 14 et 15 tours.
Question 1Compter les occupants
Écrire le corps de la méthode nb_occupants_restants de la classe Piece. Comme son nom l'indique, cette méthode doit renvoyer le nombre d'occupants restants dans la pièce. La fonction test_nb_occupants_restants présente dans le fichier vous permettra d'effectuer une première série de tests.
Cette cellule contient toute la classe : les méthodes des questions 3 et 4 s'y trouvent aussi.
Appel professeur
À demander au candidat
- Quel est le type de
self.grille? Décrivez sa structure et la façon de parcourir toutes ses cases. - Que renverrait la méthode si l'on oubliait le
return? De quel type est cette valeur ?
self.grille est une liste de listes : il faut deux boucles imbriquées, ou sum sur chaque ligne.
Résultats attendus
- Pièce de l'exemple
- 7 occupants
Question 2Simuler l'évacuation complète
Écrire le corps de la fonction evacuation afin qu'elle simule l'évacuation complète de la pièce et renvoie le nombre de tours nécessaire. On pourra, dans cette fonction, faire appel à la méthode alerter qui simule un tour et renvoie True si des déplacements ont pu avoir lieu, False sinon.
En complément de la pièce à évacuer, la fonction evacuation a un paramètre silencieux dont la valeur par défaut est True. Si ce paramètre vaut False, l'état de la pièce doit être affiché à chaque tour dans la console. La fonction test_evacuation vous permettra d'effectuer une série de tests.
Appel professeur
À demander au candidat
- Pourquoi une boucle
whileplutôt quefor? Qu'est-ce qui rend le nombre de tours inconnu à l'avance ? - Aurait-il été correct d'écrire
while p.alerter():? Justifiez.
La condition d'arrêt est « plus personne dans la pièce », pas la valeur renvoyée par alerter.
Une boucle qui n'appelle pas alerter ne s'arrête jamais : la page l'interrompt au bout de 10 secondes.
Résultats attendus
- Tests fournis
- 11, 14 et 15 tours
Question 3Des sorties au sud et à l'est
Modifier la méthode ajouter_sortie(self, direction, position) afin qu'il soit aussi possible d'ajouter une sortie dans les directions qui ne sont pour l'instant pas prises en compte : "S" (pour le sud) et "E" (pour l'est). Le paramètre position désigne l'indice de la case sur le côté correspondant. La méthode se trouve dans la classe, à la question 1.
La fonction test_ajouter_sortie vous permettra d'effectuer une première série de tests. Sur l'ordinateur, l'IHM permet aussi d'ajouter des sorties dans les quatre directions, sans modifier son code.
Appel professeur
À demander au candidat
- Les sorties sont des couples (ligne, colonne). Pour une sortie au sud en position 3 dans une pièce 5 × 7, quel couple ajouter ?
- Pourquoi utiliser
self.i_maxetself.j_maxplutôt que les nombres 4 et 6 ?
Ne pas confondre profondeur (axe i, lignes) et largeur (axe j, colonnes).
Résultats attendus
- N 5, S 3, E 2, O 1 dans une pièce 5 × 7
[(0, 5), (4, 3), (2, 6), (1, 0)]
Question 4La sortie la plus proche
On s'aperçoit que, lorsqu'une pièce possède plusieurs sorties, seule la première est utilisée par les occupants. Le problème vient de la méthode choix_sortie(self, i, j) qui renvoie la sortie à utiliser pour une personne positionnée sur la ligne i et la colonne j.
Identifier l'erreur logique et la variable non définie dans le code de cette méthode, puis effectuer les corrections nécessaires afin qu'elle renvoie la sortie la plus proche. La méthode se trouve dans la classe, à la question 1. La fonction test_choix_sortie vous permettra d'effectuer une première série de tests.
Appel professeur
À demander au candidat
- Pourquoi la condition
k < 0ne peut-elle jamais être vraie ? Quelle conséquence sur le comportement de la méthode ? - Que vaut
d2dans la version fournie ? Quelle erreur obtiendrait-on si cette branche était atteinte ? - Expliquez l'algorithme corrigé : comment garantit-il la sortie la plus proche en distance de Manhattan ?
- Pourquoi
test_choix_sortiemodifie-t-il directementp1.sortiesau lieu d'appelerajouter_sortie?
Deux erreurs : une condition toujours fausse (k < 0) et une variable d2 jamais calculée.
Résultats attendus
- Essai 2 avec une sortie (N 5)
- 14 tours
- Avec deux sorties (N 5, O 1)
- 11 tours
- Avec quatre sorties
- 6 tours
Le fichier du candidat
Le jour de l'épreuve, le candidat travaille dans un seul fichier. Ce bouton rassemble vos cellules dans l'ordre, telles qu'elles sont à l'écran, en un simulation_evacuation.py à ouvrir dans votre éditeur habituel.