Adloun

Sortie d'un labyrinthe

Exercice · OCaml (option informatique), chapitre 11 — Récursivité et retour sur trace

Énoncé

Un labyrinthe est une matrice de booléens (true = mur). Écrire accessible laby qui teste si l'on peut aller du coin (0,0) au coin (n-1,m-1) par déplacements orthogonaux.

Corrigé

let accessible laby =
  let n = Array.length laby and m = Array.length laby.(0) in
  let vu = Array.make_matrix n m false in
  let rec explore i j =
    if i < 0 || i >= n || j < 0 || j >= m then false
    else if laby.(i).(j) || vu.(i).(j) then false
    else if i = n - 1 && j = m - 1 then true
    else begin
      vu.(i).(j) <- true;
      explore (i + 1) j || explore (i - 1) j
      || explore i (j + 1) || explore i (j - 1)
    end
  in
  explore 0 0

On explore en profondeur, en marquant les cases visitées (vu) pour ne pas tourner en rond : c'est ici l'état mutable du backtracking. On renvoie true dès qu'on atteint la sortie (le || élague les autres directions). Inutile de « démarquer » : pour la simple accessibilité, une case déjà explorée sans succès le restera. (Marquer évite une récursion infinie entre deux cases voisines.)

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.