Sunteți pe pagina 1din 5

Neagoie Octavian Augustin Fizica-informatica,anul II Grupa 521 b Proiect

1.Enuntul problemei
Traseu in labirint
Fie un labirint(o retea dreptunghiulara)-cu cellule ocupate (x) si libere (*).Fie un robot (R) in acest labirint. X*XX*** *X**X** ******* ***R**X *X****X ****X** *X*X*** (a)Testati daca R poate iesi din labirint (poate ajunge la margine?) (b)Determinati un drum pentru iesirea din labirint (daca exista). (c)Determinati un drum de lungime minima pentru iesire (daca exista). Se va folosi :Stiva (Coada),Coada cu prioritati.

2. Specificare
Acest program rezolva problema labirintului folosind metode backtracking generalizat. Stiva este reprezentata sub forma unui tablou cu 2 coloane, prima reprezentand linia si ce-a de-a doua coloana. In tabloul minim se retine configuratia stivei pentru cel mic drum gasit pana in momentul respectiv. Tabloul deplasare retine cele patru moduri de deplasare la un moment dat : SUD, NORD, EST, VEST. Vectorul l retine labirintul, fiecare pozitie libera fiind codificata cu 1 , iar zidul fiind codificat cu 0. n =nr de linii m=nr de coloane lmin lungimea drumului minim Citirea labirintului se face din fisier astfel : -pe prima linie nr n de linii si nr m de coloane - pe urmatoarele n linii se afla liniile labirintului - ultimele 4 linii contin modul de deplasare in labirint : VEST, EST, NORD, SUD Procedura CITIRE realizeaza citirea din fisier

Functie VALID testeaza daca o configuratie a stivei este sau nu valida returnand true daca este valida si false in caz contrar. Se verifica daca pozitia curenta a mai fost sau nu vizitata in prealabil ( pozitiile anterioare sunt retinute in stiva de pe pozitia 1 pe pozitia p-1). Daca a mai fost vizitata, atunci configuratia nu mai este valida. Daca pozitia curenta in labirint nu este libera, (este zid), atunci configuratia nu este valida, deci validintoarce valoarea false. Functia FINAL testeaza daca solutia retinuta in stiva este finala, adica daca s-a iesit din labirint. O solutie este finala daca s-a ajuns la iesirea din labirint, adica linie este 1(prima) sau n(ultima) sau coloana este 1(prima) sau m (ultima). Procedura TIPAR tipareste solutia, adica configurtia stivei si in cazul in care s-a gasit o solutie (un drum mai mic), atunci acesta se retine in min si lungimea acestuia in lmin. Procedura MINIM tipareste solutia minima (cel mai scurt drum de iesire din labirint) Procedura BACKTRACKING.De pe pozitia curenta se incearca deplasarea in unul din cele patru moduri posibile. Daca solutia obtinuta este valida, atunci daca e finala, se tipareste. In caz contrar, (e valida ,dar nu e finala) se incearca o noua deplasare ( se apeleaza recursiv pentru nivelul p+1). In cazul in care solutia nu e valida, fiind vorba de o procedura recursiva, aceasta se intoarce din auto apel la configuratia anterioara ( pastrata in heap). Algoritm backtracking Pentru i de la 1 la 4 executa pt [p,1] [p-1,1]+depl [i,1] st pt [p,2] [p-1,2]+depl [i+2] st daca solutia este valida daca solutia este finala atunci tipareste solutia altfel apeleaza recursiv pentru p+1 sfarsit daca sfarsit daca sfarsit pentru

3.Diagrama UML
mat

+mat l; +int st; +int min; +int dep l; +int n; +int m; +int l min; -void citire (); -void afis (); -boolean valid(int); -boolean final (int); -void tipar (); -void minim ();

-void bktr (int);

4. Algoritmul
uses crt; type mat=array[1..10,1..10] of 0..1; var l:mat; st,min:array[1..20,1..2] of integer; depl:array[1..4,1..2] of -1..1; n,m,lmin:integer; procedure citire; var f:text; i,j:integer; c:char; begin assign(f,'lab.txt'); reset(f); readln(f,n,m); for i:=1 to n do begin for j:=1 to m do begin read(f,c); case c of '*':l[i,j]:=1; 'x':l[i,j]:=0; 'R':begin l[i,j]:=1; st[1,1]:=i;st[1,2]:=j; end; end; end; readln(f); end; for i:=1 to 4 do readln(f,depl[i,1],depl[i,2]); close(f); end; {procedure afis; var i,j:integer; begin for i:=1 to n do begin for j:=1 to n do write(l[i,j],' '); writeln; end; end;}

function valid(p:integer):boolean; var i:integer; begin valid:=true; for i:=1 to p-1 do if(st[i,1]=st[p,1])and(st[i,2]=st[p,2]) then valid:=false; if(l[st[p,1],st[p,2]]=0) then valid:=false; end; function final(p:integer):boolean; begin final:=false; if(st[p,1]=1)or(st[p,1]=n)or(st[p,2]=1)or(st[p,2]=m) then final:=true; end; procedure tipar(p:integer); var i:integer; begin if p<lmin then begin lmin:=p; for i:=1 to p do begin min[i,1]:=st[i,1]; min[i,2]:=st[i,2]; end; end; for i:=1 to p do write('(',st[i,1],',',st[i,2],') '); writeln; end; procedure minim; var i:integer; begin writeln('Drumul de lungime minima este are lungimea: ',lmin,' si este: '); for i:=1 to lmin do write('(',min[i,1],',',min[i,2],') '); writeln; end; procedure bktr(p:integer); var i:integer; begin for i:=1 to 4 do begin st[p,1]:=st[p-1,1]+depl[i,1]; st[p,2]:=st[p-1,2]+depl[i,2]; if valid(p) then if final(p) then tipar(p) else bktr(p+1); end; end; begin clrscr;

citire; lmin:=maxint; bktr(2); minim; readkey; end.

S-ar putea să vă placă și