Adloun

informatique (MP2I/MPI) · Chapitre 14 · Application directe du cours

Problème — Le sudoku : la même exploration, deux ordres de choix

Exploration exhaustive et retour sur trace · niveau 3 (difficile)

Énoncé

Une grille de sudoku est un tableau à remplir de chiffres de à sans répétition sur une ligne, une colonne ou un bloc .

  • Écrire un solveur par retour sur trace remplissant les cases dans l'ordre lexicographique.
  • Le modifier pour traiter d'abord la case ayant le moins de valeurs possibles.
  • Mesurer les deux sur une grille facile et une grille difficile, et expliquer l'écart.

Corrigé de la question 1

1. Le solveur lexicographique.


(* Vrai si la grille g admet un remplissage ; g est alors modifiée en place et
   contient une solution. Précondition : g est un tableau 9 x 9, 0 = case vide,
   et les chiffres déjà posés respectent les règles. *)
let admissible g i j v =
  let ok = ref true in
  for k = 0 to 8 do
    if g.(i).(k) = v || g.(k).(j) = v then ok := false
  done;
  let bi = 3 * (i / 3) and bj = 3 * (j / 3) in
  for a = 0 to 2 do for b = 0 to 2 do
    if g.(bi + a).(bj + b) = v then ok := false done done;
  !ok

let resoudre g =
  let rec explorer k =
    if k = 81 then true
    else
      let i = k / 9 and j = k mod 9 in
      if g.(i).(j) <> 0 then explorer (k + 1)     (* case donnée : on passe *)
      else begin
        let fini = ref false and v = ref 1 in
        while not !fini && !v <= 9 do
          if admissible g i j !v then begin
            g.(i).(j) <- !v;
            if explorer (k + 1) then fini := true
            else g.(i).(j) <- 0                   (* on DÉFAIT *)
          end;
          incr v
        done;
        !fini
      end
  in explorer 0

Terminaison : variant , qui décroît strictement à chaque appel récursif. Correction : à tout instant la grille est partiellement valide — l'appel n'est fait qu'après un test admissible —, et l'on n'atteint qu'avec les cases remplies, donc avec une solution.

Question 2 : comment l'IA t'aide

2. Le modifier pour traiter d'abord la case ayant le moins de valeurs possibles.

Élève

Je garde le solveur de la question 1, mais au lieu d'avancer avec , je cherche à chaque appel la case vide qui a le moins de candidats. Le problème, c'est la terminaison : sans indice , je ne vois plus quel variant utiliser.

IA

Chaque appel récursif est lancé juste après avoir posé un chiffre dans une case vide. Quelle quantité liée à la grille diminue alors strictement d'un appel au suivant ?

Élève

Le nombre de cases vides baisse de un à chaque appel et reste positif ; quand il atteint zéro, il n'y a plus de case à choisir.

IA

C'est un bon variant. Que doit renvoyer ton appel si la case la plus contrainte n'a aucun candidat ? En quoi ce choix de case détecte-t-il une impasse plus tôt que l'ordre lexicographique ?

L'IA ne donne pas la réponse : elle pose la question qui fait avancer. À toi de continuer.

Continue cet exercice avec l'IA

Reprends la question 2 là où le dialogue s'arrête, puis la suite de l'exercice.

Continuer avec l'IA — gratuit, sans inscription

Gratuit, sans inscription. L'IA te guide pas à pas, sans te donner la réponse.

Le cours du chapitre · Tous les exercices du chapitre

Continuer avec l'IA, gratuit →