Corrigé Centrale 2025 Informatique MPI — Partie A, IV (Q17 à Q18) : Solution optimale par parcours en largeur, gestion de la mémoire
Sujet officiel du concours Centrale, session 2025, épreuve Informatique MPI. Corrigé rédigé par Ibrahim Alame.
Sujet officiel (PDF, site du concours)
Énoncé
On dispose, en plus des fonctions des parties I à III, de bool e_gagne(etat *e) (la voiture grise est devant la sortie) et de etat *e_copie(etat *e) (copie d'un état). Un mouvement est un déplacement de la liste renvoyée par e_deplacements.
Q17. Écrire int resout(etat *e) : nombre minimal de mouvements pour gagner depuis , ou s'il n'y a pas de solution ; la mémoire de doit être libérée à la fin de l'appel. Le champ distance peut servir à noter le nombre minimal de coups depuis l'état initial.
Q18. Montrer que resout n'engendre aucun problème mémoire.
Corrigé
Q17. Le graphe des états a pour sommets les états accessibles depuis et un arc pour chaque mouvement ; on cherche la distance de au plus proche état gagnant. Les arcs ont tous le même coût : c'est un parcours en largeur, avec la file de la partie II et, pour l'ensemble des états déjà découverts, la table de hachage de la partie III.
int resout(etat *e) {
tableh *vus = t_nouveau();
file *f = f_nouveau();
e->distance = 0;
t_ajoute(vus, e);
f_enfile(f, e);
int resultat = -1;
while (f->taille > 0) {
etat *x = f_defile(f);
if (e_gagne(x)) {
resultat = x->distance;
break;
}
deplacement *lst = e_deplacements(x);
for (deplacement *d = lst; d != NULL; d = d->suivant) {
etat *y = e_copie(x);
vehicule *v = &y->v[d->k];
if (v->direction == 'H') v->j += d->pas;
else v->i += d->pas;
if (t_contient(vus, y)) {
e_libere(y);
} else {
y->distance = x->distance + 1;
t_ajoute(vus, y);
f_enfile(f, y);
}
}
d_libere(lst);
}
f_libere(f);
t_libere(vus);
return resultat;
}
Correction. C'est le parcours en largeur du cours, à deux invariants près. (i) Tout état de la file est dans vus, et distance y vaut la longueur d'un chemin de à cet état ; un état n'est enfilé qu'une fois, lors de sa découverte. (ii) Les distances des états de la file, de la tête à la queue, sont croissantes au sens large et diffèrent d'au plus . Il en découle, comme pour tout parcours en largeur, que les états sont défilés par distance croissante et que distance est la distance minimale depuis (un état découvert depuis ne peut pas l'avoir été plus tôt par un chemin plus court, sinon il serait déjà dans vus). Le premier état gagnant défilé réalise donc le nombre minimal de mouvements. Si la file se vide sans état gagnant, tous les états accessibles ont été examinés et aucun ne gagne : on renvoie . Le test t_contient repose sur e_egal, licite ici puisque tous les états comparés sont accessibles depuis (mêmes véhicules, mêmes indices ; Q13).
100 % gratuit
La suite du corrigé est sur Adloun
Le corrigé rédigé en entier, question par question, et le tuteur pour poser des questions sur ce sujet.
Voir le corrigé complet, gratuitementInscription gratuite en 30 secondes (e-mail, nom d'utilisateur, mot de passe, classe ou profil), sans carte bancaire : arrivée directe sur le corrigé.