Voila le sujet
Je doit représenter un labyrinthe de cette façon :
Les cellules sont repérées par des couples d'entiers (i,j).
Pour chaque cellule (i,j), 4 booléens appelés N,S,E,W indiquent si on peut ou non gagner la cellule au nord (i,j+1), au sud (i,j-1) , à l'est (i+1,j) ou à l'ouest (i,j-1).
• Créer un labyrinthe en choisissant chacun des booléens N et E de façon aléatoire (les booléens S et W seront calculés).
• Faire une représentation graphique.
• Trouver un algorithme permettant de traverser le labyrinthe du coin SW au coin NE si c'est possible.
J'ai réussi à affiché un labyrinthe où le nord et l'est de chaque case est choisi au hasard.
La chose a faire maintenant c'est de créé un algorithme qui permette de tracer un chemin qui traverse le labyrinthe si il y a une solution...
Voilà ce que j'ai commencé a faire( j'utilise la bibliothèque Wingraph):
program labyrinthe;
uses wincrt,wingraph;
type abscisse = array[0..50] of integer;
ordonnee = array[0..50] of integer;
deplacement = array[1..50,1..50] of boolean;
procedure contour_laby (Long,Larg:integer; var x:abscisse; var yrdonnee);
var i,j:integer;
begin echelle_ortho(-1,Long+1,-1,Larg+1);
for i:=0 to Long do x[i]:=i;
for j:=0 to Larg do y[j]:=j;
deplace(x[0],y[0]);
trace(x[0],y[Larg]);trace(x[Long-1],y[Larg]);
deplace(x[Long],y[Larg]);
trace(x[Long],y[0]);trace(x[Long-Long+1],y[0]);
end;
procedure autorisation_deplacement (Long,Larg:integer; var N,S,E,W:deplacement);
var i,j,D,F:integer;
begin
Randomize;
for i:=1 to Long do begin
for j:=1 to Larg do begin D:=random(100);
if D<50 then N[j,i]:=FALSE else N[i,j]:=TRUE;
F:=random(200);
if F<100 then E[i,j]:=TRUE else E[i,j]:=FALSE;
end;
end;
for j:=1 to Larg do begin
E[Long,j]:=False;
W[1,j]:=False;
end;
for i:=1 to Long do begin
S[i,1]:=False;
N[i,Larg]:=False;
end;
S[1,1]:=True;
N[Long,Larg]:=True;
if N[1,1]=False then E[1,1]:=True;
if N[Long,Larg-1]=False then E[Long-1,Larg]:=True;
for i:=1 to Long-1 do begin
for j:=1 to Larg do if E[i,j]=True then W[i+1,j]:=True
else W[i+1,j]:=False;
end;
for i:=1 to Long do begin
for j:=1 to Larg-1 do if N[i,j]=True then S[i,j+1]:=True
else S[i,j+1]:=False;
end;
end;
procedure trace_laby (Long,Larg:integer; N,E:deplacement; x:abscisse; yrdonnee);
var i,j:integer;
begin
for i:=1 to Long do begin
for j:=1 to Larg do begin
if N[i,j]=False then
begin
deplace(x[i-1],y[j]);
trace(x[i],y[j]);
end;
if E[i,j]=False then
begin
deplace(x[i],y[j-1]);
trace(x[i],y[j]);
end;
end;
end;
end;
var Long,Larg,x1,y1,k,l,i:integer;
x:abscisse;
yrdonnee;
N,S,E,W:deplacement;
gauche,droite,avant,arriere:bo olean;
begin
debutgraphe;
repeat
write('Entrez la LONGUEUR de votre labyrinthe (supérieure à 0 et inférieure à 50) :');
readln(Long);
until (Long>0) and (Long<=50);
repeat
write('Entrez la LARGEUR de votre labyrinthe (supérieure à 0 et inférieure à 50) :');
readln(Larg);
until (Larg>0) and (Larg<=50);
contour_laby (Long,Larg,x,y);
autorisation_deplacement (Long,Larg,N,S,E,W);
trace_laby (Long,Larg,N,E,x,y);
fingraphe;
end.
-----