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 inscriptionGratuit, sans inscription. L'IA te guide pas à pas, sans te donner la réponse.