Adloun

La ligne qu'on oublie : combien de solutions produit-elle ?

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 14 — Exploration exhaustive et retour sur trace

Énoncé

On énumère les permutations de par retour sur trace. Que produit ce programme si l'on retire la ligne marquée ? Mesurer.


void explorer(int k) {
    if (k == n) { compte = compte + 1; return; }
    for (int c = 0; c < n; c = c + 1) {
        if (!utilise[c]) {
            utilise[c] = true;  perm[k] = c;
            explorer(k + 1);
            utilise[c] = false;      /* <-- LA LIGNE */
        }
    }
}

Corrigé

Avec la ligne, le programme trouve permutations. Sans elle, il en trouve exactement une, quel que soit :

avec `defaire`sans
221
361
4241
67201

Pour , la sortie complète passe de 012 021 102 120 201 210 à 012.

Pourquoi une seule. Sans le defaire, la première descente marque , puis comme utilisés et compte la permutation 012. Au retour, aucun de ces trois marquages n'est annulé : tous les tests if (!utilise[c]) des tours suivants échouent, et la remontée traverse toutes les boucles sans jamais redescendre.

Ce qu'il faut en retenir, et le cours l'annonce autrement. L'oubli de defaire produit un résultat faux — mais le sens de l'erreur dépend de ce que defaire annulait. Ici, l'état non annulé est une interdiction : elle survit à la remontée, et l'on trouve trop peu. Si l'état non annulé était au contraire un élément ajouté à une solution partielle, on trouverait des solutions trop longues, et trop nombreuses. Dans les deux cas, ni erreur ni plantage.

Comment on l'attrape. Par un test sur un cas dont on connaît la réponse d'avance : pour les permutations, pour les huit reines. C'est la discipline du chapitre chap:discipline : un retour sur trace se teste toujours sur un comptage connu, jamais sur l'inspection de sa sortie.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.