Soit la figure suivante :
On demande de faire le programme qui trace cette maison en un seul coup, c'est à dire sans "lever le crayon".
Structure des données
Nous devons d'abord représenter la maison en mémoire; on voit que la maison a 5 sommets : A, B, C, D, E. Pour représenter cela, nous allons utiliser un tableau de 2 dimensions qui contiendra 5 lignes et 5 colonnes.
Ensuite, dans ce tableau, on va représenter tous les chemins qu'on peut tracer par un 0 et tous les chemins qu'on ne peut pas tracer (ou qui ont déjà été tracés) par un 1.
On ne peut pas aller de A à A, donc dans le tableau, aux coordonnées (0,0) nous avons un 1; de même pour les autres sommets. Donc la diagonale du tableau (représentant les chemins AA,BB,CC,DD,EE) est mise à 1; en regardant la maison on voit qu'on ne peut pas aller de A à D (donc de D à A non plus) et de A à E (donc de E à A non plus); pour indiquer qu'on ne peut pas (ou plus) aller de A à D, on remplit le tableau en première ligne et quatrième colonne avec 1; pour indiquer qu'on ne peut pas aller de D à A on remplit le tableau en quatrième ligne (car D est le quatrième élément) et première colonne (car A est le premier élément) avec un 1. Idem pour AE.
Analyse de l'algorithme
Faisons une petite analyse du programme:
- on compte les segments à dessiner: il y en a 8 :
AB,AC,BC,BD,BE,CD,CE,DE.
- nous allons faire tous les essais possibles sur cette maison; on va donc
commencer à la première ligne du tableau et parcourir les colonnes jusqu'à
trouver un 0, ce qui indique qu'on peut aller vers ce sommet (par exemple nous
sommes à la première ligne, donc au sommet A, et on parcourt les colonnes de
cette ligne; on trouve un 0 à la deuxième colonne, donc on peut aller à B; on
occupe immédiatement cette case ainsi que celle qui va de B vers A, et on
démarre maintenant à la ligne correspondant à B, c'est à dire à la deuxième
ligne; la première colonne vide est celle qui correspond à C, étant donné que
BA a été rempli ci-dessus; on remplit les cases correspondant aux chemins BC et
CB et on démarre à la ligne correspondant à C, c'est à dire la troisième ligne,
et ainsi de suite.
- tout ceci se fait par des appels récursifs; la procédure récursive
s'appelle "cherche" et elle a 3 paramètres :
- y: c'est le sommet d'où on
part, c'est à dire la ligne en cours dans le tableau
- niveau: c'est la variable
qui indique combien de segments on a tracé; si on a tracé le huitième segment,
alors un appel récursif a lieu avec niveau=9; ceci est le point d'arrêt et on
affiche les positions accumulées dans le paramètre "st"
- st : chaîne de caractères
qui mémorise le chemin parcouru
Le programme
Voici le programme correspondant :
procedure TForm1.Button1Click(Sender: TObject);
type tab = array[0..4, 0..4] of integer;
const t1: tab =
((1, 0, 0, 1, 1),
(0, 1, 0, 0, 0),
(0, 0, 1, 0, 0),
(1, 0, 0, 1, 0),
(1, 0, 0, 0, 1));
var t: tab;
procedure cherche(colonne, niveau: integer; st: string);
var ligne: integer;
begin
if niveau = 9 then
memo1.lines.add(st)
else
for ligne := 0 to 4 do
if t[ligne, colonne] = 0 then
begin
st := st + chr(65 + colonne) + chr(65 + ligne) + ' ';
t[ligne, colonne] := 1; t[colonne, ligne] := 1;
cherche(ligne, niveau + 1, st);
t[ligne, colonne] := 0; t[colonne, ligne] := 0;
delete(st, length(st) - 2, 3);
end;
end;
procedure recherche;
var colonne: integer;
begin
memo1.lines.clear;
move(t1, t, sizeof(t));
for colonne := 0 to 4 do
cherche(colonne, 1, '');
end;
begin
recherche;
end;
Télécharger le code source Delphi