X ENS Option Informatique MP 2020Sujet, corrigé et rapport du jury
Constructions et explorations de labyrinthes
- Graphes et parcours en profondeur
- Structure de classes disjointes (union-find)
- Parcours en largeur et plus court chemin
- Preuve de programme par invariants
Téléchargements
Présentation du sujet
DifficileConstruction et résolution de labyrinthes : algorithmes de génération aléatoire et parcours en largeurAfficher ou masquer la section
Présentation du sujet
DifficileLe sujet étudie la notion de labyrinthe, défini comme un sous-graphe connexe d'un graphe non orienté partageant le même ensemble de sommets, avec un intérêt particulier pour les labyrinthes parfaits (connexes et acycliques). La partie I étudie trois algorithmes de génération aléatoire de labyrinthes parfaits, dont un parcours en profondeur et deux algorithmes fondés sur une structure de classes disjointes, dont l'algorithme d'Eller. La partie II porte sur la résolution d'un labyrinthe par parcours en largeur, avec une variante prenant en compte des monstres sur les sommets.
- 1Partie I : construire des labyrinthesÉtude du mélange de Knuth, puis de trois algorithmes de génération de labyrinthes parfaits : parcours en profondeur aléatoire, structure de classes disjointes et algorithme d'Eller.
- 2Partie II : résoudre un labyrintheRecherche d'un plus court chemin par parcours en largeur, puis variante recherchant un chemin croisant un minimum de monstres.
Difficile. La moyenne de l'ensemble des candidats n'est que de 9,28 sur 20 avec un écart-type de 4,17, et plusieurs questions comme la 12, la 15 ou la 19 n'ont été traitées correctement que par une très faible proportion de candidats.
L'épreuve en chiffres
Moyenne 9,7 / 20 · écart-type 4,07 · 827 présents · où vous situez-vous ?Afficher ou masquer la section
L'épreuve en chiffres
- Moyenne
- 9,7/ 20
- Écart-type
- 4,07
- Présents
- 827
Votre note sur 20 à ce sujet, en conditions de concours.
Source : document officiel du concours. Notes publiées par le concours (après harmonisation le cas échéant). Courbe : estimation par une loi normale.
Ce qu'a observé le jury
5 erreurs relevéesNotion de labyrinthe parfait incomprise · Preuve de la question 11 incomplète · Modulo d'un entier négatif mal géréAfficher ou masquer la section
Ce qu'a observé le jury
5 erreurs relevéesLe jury regrette des copies souvent difficiles à lire, mal indentées ou non structurées, ainsi qu'une maîtrise insuffisante des preuves par invariants, pourtant suggérées par l'énoncé. Il relève de nombreuses erreurs de syntaxe et de sémantique en OCaml, en partie dues à des réflexes venus de Python, et regrette des programmes inutilement compliqués alors que des solutions courtes étaient attendues.
Les erreurs les plus sanctionnées
- 1Notion de labyrinthe parfait incomprise4
De nombreux candidats ne vérifient que l'acyclicité du labyrinthe, en oubliant de vérifier la connexité, alors que les deux propriétés définissent un labyrinthe parfait.
« La notion de labyrinthe parfait est incomprise par de nombreux candidats, qui ne vérifient que l’acyclicité, oubliant la connexité. »
- 2Preuve de la question 11 incomplète11
La plupart des candidats qui traitent cette question ne montrent que l'acyclicité du sous-graphe obtenu, alors que la principale difficulté résidait dans la preuve de la connexité.
- 3Modulo d'un entier négatif mal géré13
En OCaml, le modulo d'un entier négatif est négatif, ce qui rendait incorrecte une écriture naïve de la mise à jour de l'indice de début de la file.
- 4Preuve du parcours en largeur peu maîtrisée15
Seuls 3 % des candidats obtiennent la totalité des points à cette question, alors que le parcours en largeur est au programme ; certains donnent même la preuve d'une autre mise en œuvre de l'algorithme que celle décrite dans le sujet.
- 5Énoncé des invariants de boucle rarement maîtrisé19
Très peu de candidats savent énoncer proprement des invariants de boucle, même inexacts, alors que des exemples d'invariants étaient donnés dans l'énoncé.
« Très peu de candidats savent énoncer proprement des invariants de boucle »
Ce qui a été bien réussi
- La question 1, sans difficulté particulière, est traitée par 100 % des candidats et entièrement réussie par 74 % d'entre eux.
- La question 5 s'écrivait très facilement avec une fonction récursive en une ligne, et 74 % des candidats obtiennent la totalité des points.
- La question 8 est traitée par 76 % des candidats avec 52 % de réussite totale.
- La question 14 est traitée par 96 % des candidats.
Conseils du jury
- Rédiger des réponses claires, bien indentées et structurées en paragraphes plutôt que raturées.
- Utiliser un schéma de preuve par invariants plutôt qu'une récurrence sur la taille de la structure de données lorsque le sujet le suggère.
- Privilégier des programmes courts en utilisant les fonctions de bibliothèque standard proposées par l'énoncé.
- Faire attention aux différences de syntaxe et de sémantique entre OCaml et Python, notamment sur l'immuabilité des listes et le typage.
Synthèse rédigée par WikiPrépa à partir du rapport officiel du jury (à télécharger en PDF). Les citations sont extraites du rapport.
Ces sujets peuvent vous intéresser
Lecture du sujet en ligne
L'énoncé complet, avec les formules et les figures, sans ouvrir le PDF.Afficher ou masquer la section
Lecture du sujet en ligne
ECOLE POLYTECHNIQUE - ECOLES NORMALES SUPERIEURES
CONCOURS D'ADMISSION 2020
MARDI 21 AVRIL 2020-14h00-18h00
FILIERE MP (Spécialité Informatique) Epreuve
n^∘4
INFORMATIQUE A (XULCR)
L'utilisation des calculatrices n'est pas autorisée pour cette épreuve
Cette composition ne concerne qu'une partie des candidats de la filière MP, les autres candidats effectuant simultanément la composition de Physique et Sciences de l'Ingénieur.
Pour la filière MP, il y a donc deux enveloppes de Sujets pour cette séance.
Constructions et explorations de labyrinthes
- soit de la forme
v − (v + 1) pour0 ≤ v < nm tel que v modulo m est distinct dem − 1 , - soit de la forme
v − (v + m) pour0 ≤ v < (n − 1)m .

type graphe = {
n: int; (* les sommets sont 0, 1, ..., n-1 *)
adj: int list array; (* adj.(v) est la liste des voisins de v *)
}
ajoute_arete: graphe -> int -> int -> unit
graphe_vide: int -> graphe
aretes: graphe -> (int * int) array
une constante
Partie I. Construire des labyrinthes

Indication : en notant toujours
- pour tous
0 ≤ p < i et0 ≤ q < i , on aPr(x_p = q) = 1/i , - pour tout
i ≤ p < n , on ax_p = p .
type classes_disjointes = {
lien: int array;
}
type classes_disjointes = {
lien: int array;
rang: int array;
}
Question 6. Écrire une fonction cd_union: classes_disjointes -> int -> int -> unit qui prend en arguments une relation d'équivalence sur
- tout classe de rang
k possède au moins2^k éléments; - dans une classe de rang
k , la longueur du plus long chemin jusqu'au représentant est égale àk .
- on construit une relation d'équivalence sur
{0, 1, …, n − 1} avec cd_init; - on construit le tableau de toutes les arêtes du graphe
g , puis on le mélange avec melange_knuth; - on parcourt ce tableau mélangé et, pour chaque arête
v − w , si v et w ne sont pas dans la même classe d'équivalence, on ajoute l'arête v - w au labyrinthe h et on fusionne les classes de v et w avec cd_union.
- pour chaque ligne, sauf la dernière :
(a) on parcourt toutes les arêtesv − (v + 1) de cette ligne, dans un ordre aléatoire. Si les sommets v etv + 1 ne sont pas dans la même classe d'équivalence, on les connecte avec probabilité1/2 ;
(b) on choisit un sous-ensemble aléatoire de sommets de cette ligne qui contient au moins un sommet de chaque classe d'équivalence. On relie chacun des sommets de ce sousensemble avec le sommet situé juste en dessous sur la ligne suivante. - on parcourt toutes les arêtes
v − (v + 1) de la dernière ligne, dans un ordre aléatoire. On connecte les sommets v etv + 1 si ils ne sont pas dans la même classe d'équivalence.
Question 12. Prouver que tout labyrinthe parfait sur la grille g peut être obtenu par l'algorithme d'Eller.
Partie II. Résoudre un labyrinthe
type file = {
contenu: int array;
mutable debut: int;
mutable taille: int;
}

ajoute_debut: file -> int -> unit
retire_debut: file -> int
ajoute_fin : file -> int -> unit
retire_fin : file -> int
Question 14. Donner le code de la fonction retire_debut.
- créer un tableau distance de taille n , initialisé avec la valeur -1 dans toutes les cases;
- créer une file à deux bouts
f de capacitén ; - ajouter le sommet source
src dansf et initialiser distance. (src) à 0 ; - tant que la file
f n'est pas vide :
(a) retirer l'élément v au début de f ;
(b) siv = dst alors on a terminé et la réponse est distance. (dst) ;
(c) sinon, pour chaque voisinw dev pour lequel distance.(w) vaut -1 , ajouterw à la fin def et donner à distance. (w) la valeur distance. (v) +1 .
- le tableau distance contient maintenant, pour chaque sommet v déjà atteint, un couple (
m, ℓ ) oùm est le nombre de monstres etℓ la longueur d'un chemin de src à v qui passe par un minimum de monstres; - quand on atteint un nouveau sommet w pour la première fois, on le rajoute à la fin de la file
f s'il y a un monstre sur le sommet w et au début sinon.
let minimum_monstres g monstre src dst =
let distance = Array.make g.n (-1,-1) in (* 1 *)
let f = file_vide g.n in (* 2 *)
... (* 3 *)
let rec loop () = (* 4 *)
let v = retire_debut f in (* a *)
if v = dst then distance.(v) else begin (* b *)
List.iter (fun w -> (* c *)
... (* pour chaque voisin w de v *)
) g.adj.(v);
loop ()
end in
loop ()
- initialisation :
- créer un tableau distance de taille n , initialisé avec la valeur (
− 1, − 1 ) dans toutes les cases, - créer trois files f, sources_courantes et sources_suivantes de capacité n,
- ajouter le sommet source src dans
f et initialiser distance. (src) à ( 0,0 ) s'il n'y a pas de monstre sur le sommet src et à(1, 0) sinon;
- tant que la destination n'est pas atteinte:
(a) si la filef est vide,
i. si la file source_courantes est vide, déplacer tous les éléments de sources_suivantes dans sources_courantes,
ii. déplacer tous les éléments de sources_courantes avecℓ minimal dansf ;
(b) retirer l'élément v au début de f et soit(m, ℓ) = distance.(v) ;
(c) siv = dst alors on a terminé et la réponse est(m, ℓ) ;
(d) tant qu'il y a au début de sources_courantes un sommet à distance (m, ℓ + 1 ), le retirer de sources_courantes et l'ajouter à la fin def ;
(e) pour chaque voisinw dev pour lequel distance. (w ) vaut (− 1, − 1 ),
- s'il n'y a pas de monstre sur
w , ajouter w à la fin def et donner à distance. (w) la valeur(m, ℓ + 1) ; - s'il y a un monstre sur
w , ajouterw à la fin de sources_suivantes et donner à distance. (w) la valeur(m + 1, ℓ + 1) .

| étape | affectations distance | f | sources_ courantes | sources_ suivantes |
| 1 |
|
0 |
|
|
| 2be |
|
1 | 3 | |
| 2be |
|
2 | 3, 4 | |
| 2be |
|
|
3, 4, 5 | |
| 2a | 3 | 4, 5 |
|
|
| 2bde |
|
4, 6 | 5 | |
| 2bde |
|
6, 5 |
|
7 |
| 2be |
|
6, 8 | ||
| 2b | 8 | |||
| 2bc |
|
.jpg)
Questions fréquentes
4 questionsSur quels chapitres porte le sujet d'informatique X-ENS MP option info 2020 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quels chapitres porte le sujet d'informatique X-ENS MP option info 2020 ?
Il porte sur les graphes, avec la construction de labyrinthes parfaits par parcours en profondeur et structures de classes disjointes, puis leur résolution par parcours en largeur.
Quelle est la moyenne du sujet de labyrinthes X-ENS MP option info 2020 ?
D'après le rapport, la moyenne est de 9,28 sur 20 avec un écart-type de 4,17, sur 1127 copies, et de 9,70 pour les seuls candidats français.
Le sujet de labyrinthes X-ENS MP 2020 nécessite-t-il de traiter tout l'énoncé ?
Non, le rapport précise que pour obtenir la note maximale, il n'était pas nécessaire de traiter l'intégralité du sujet.
Quelles sont les erreurs les plus fréquentes relevées par le jury sur ce sujet d'informatique X-ENS MP 2020 ?
Le jury cite la confusion entre acyclicité et connexité pour un labyrinthe parfait, la mauvaise gestion du modulo d'un entier négatif en OCaml, et une faible maîtrise des preuves par invariants.
Pas de description pour le moment
