Épreuve pratique NSI

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

Repère

Les durées d'évacuation des tests fournis ne dépendent pas du hasard : 11, 14 et 15 tours.

1

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

  1. Quel est le type de self.grille ? Décrivez sa structure et la façon de parcourir toutes ses cases.
  2. Que renverrait la méthode si l'on oubliait le return ? De quel type est cette valeur ?
Point de vigilance

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
2

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

  1. Pourquoi une boucle while plutôt que for ? Qu'est-ce qui rend le nombre de tours inconnu à l'avance ?
  2. Aurait-il été correct d'écrire while p.alerter(): ? Justifiez.
Point de vigilance

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
3

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

  1. Les sorties sont des couples (ligne, colonne). Pour une sortie au sud en position 3 dans une pièce 5 × 7, quel couple ajouter ?
  2. Pourquoi utiliser self.i_max et self.j_max plutôt que les nombres 4 et 6 ?
Point de vigilance

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)]
4

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

  1. Pourquoi la condition k < 0 ne peut-elle jamais être vraie ? Quelle conséquence sur le comportement de la méthode ?
  2. Que vaut d2 dans la version fournie ? Quelle erreur obtiendrait-on si cette branche était atteinte ?
  3. Expliquez l'algorithme corrigé : comment garantit-il la sortie la plus proche en distance de Manhattan ?
  4. Pourquoi test_choix_sortie modifie-t-il directement p1.sorties au lieu d'appeler ajouter_sortie ?
Point de vigilance

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.

Chargement de Python…