Sunteți pe pagina 1din 7

Problema labirintului

S presupunem c labirintul are forma unei grdini englezeti de form rectangular, mprejmuit de gard viu.De-a lungul perimetrului acesteia, gardul viu este ntrerupt de una sau mai multe ieiri.n interior, grdina este alctuit din coridoare mprejmuite, la rndul lor, de garduri vii.Problema care se pune este aceea c, pornind dintr-un punct interior grdinii, dintr-o poziie iniial aflat pe un coridor, s se gseasc calea ce conduce, parcurgnd numai coridoare (fra a avea posibilitatea de a trece prin gard viu!), la ieirea din labirint. Exemplu de labirint:

H H H H H H H H

H . H . H . . H

H . . . H . H H

H H . H . . . H

H H . . . H . H

H H H H . H . H

H . . . . H . H

H . H H H . . H

H . H . H . H H

H . H . H . H H

H H . . H . . .

H H H H H H H H

Am figurat cu ajutorul caracterului H gardul viu, iar cu ajutorul caracterului . spaiul asociat coridoarelor.Se observ c, pentru reprezentarea acestei grdini-labirint, se folosete un tablou bidimensional(ale crui elemente sunt caracterele H i .).Suplimentar, o s folosesc denumirea de parcel asociat unei arii elementare de pe suprafaa grdinii.n reprezentarea iniial a labirintului, unei parcele libere i corespunde caracterul ., iar o parcel ocupat este marcat prin H.Ulterior, pe msur ce se efectueaz deplasri pe coridoarele labirintului, parcelele prin care am trecut deja, se vor nota cu o, ele pierznd atributele de libere.

n rezolvarea problemei o s folosesc pentru orientare, mijloacele clasice:punctele cardinale.O prim schi a soluiei problemei labirintului este urmtoarea (notez P poziia curent pe coridoare, prin aceast poziie ncercnd s ne continum drumul spre ieire, prin avansarea la o parcel liber din imediata vecintate): if parcela P se afl pe conturul grdinii then am gsit ieirea din labirint else begin ncearc s te ndrepi spre Est; if nu am gsit nc ieirea then ncearc s te ndrepi spre Sud; if nu am gsit nc ieirea then ncearc s te ndrepi spre Vest; if nu am gsit nc ieirea then ncearc s te ndrepi spre Nord; end; Soluia trebuie explicitat!Voi detalia nelesul ncearc s te ndrepi spre Est, pentru cellalte trei puncte cardinale analogia fiind imediat: {ncearc s te ndrepi spre Est} if poziia vecin la Est lui P este o parcel liber(coridor) then gsete o cale de la parcela vecin la Est lui P pn la ieire; Evident, problema pus: gsete o cale de la parcela vecin la Est lui P pn la ieire este echivalent problemei originale: gsete o cale de la P la ieire!Trebuie specificat c ordinea de investigare propus (Est,Sud,Vest,Nord) a fost aleas arbitrar, problema rezolvndu-se similar pentru orice alt combinaie a celor patru puncte cardinale. Pentru rezolvare, voi folosi o procedur, gsit , avnd drept parametrii coordonatele unei parcele i sarcina de a determina calea de ieire din labirint, pornind din aceast parcel.Procedura este de tip recursiv.

Programul (algoritmul propriu-zis):


Program Labirintul; uses fdelay,crt; const limnord=1; limsudmax=20; limvest=1; limestmax=20; coridor='.'; gard='H'; pas='o'; marcat='^'; type latitudine=limnord..limsudmax; longitudine=limvest..limestmax; parcele=string[20]; var labirint:array[1..20] of parcele; startlat:latitudine; startlong:longitudine; limsud,i:1..limsudmax; limest,j:1..limestmax; gasit:boolean; f:text; Procedure gasesc(lat:latitudine; long:longitudine); Begin if (lat=limnord) or (lat=limsud) or (long=limvest) or (long=limest) then gasit:=true else begin labirint[lat,long]:=pas; if labirint[lat,long+1]=coridor then gasesc(lat,long+1); if not gasit then if labirint[lat+1,long]=coridor then gasesc(lat+1,long); if not gasit then if labirint[lat,long-1]=coridor then gasesc(lat,long-1); if not gasit then if labirint[lat-1,long]=coridor then gasesc(lat-1,long); end; if gasit then labirint[lat,long]:=marcat; End; Begin{PP} {Secventa de citire a labirintului: a)citirea de la tastatura; b)citirea dintr-un fisier} {a)} {write('dimensiune sud(maxim20)= '); readln(limsud);

write('dimensiune est(maxim20)= '); readln(limest); writeln; writeln('introduceti pe linii structura labirintului'); writeln('folositi caracterele:'); writeln(' H-gard'); writeln(' .-coridor'); writeln; for i:=1 to limsud do for j:=1 to limest do begin write('pozitia',i:2, ',' ,j:2, ':'); readln(labirint[i,j]) end; writeln; writeln('labirintul propus arata astfel:'); writeln; for i:=1 to limsud do begin for j:=1 to limest do write(labirint[i,j]); writeln; end; writeln; writeln('precizati pozitia initiala'); Repeat writeln('linia (1..',limsud:2,')='); readln(startlat); write('coloana (1..',limest:2,')='); readln(startlong); writeln; Until labirint[startlat,startlong]='.';} {b)} Assign(f,'lab.in');Reset(f); readln(f,limsud,limest); for i:=1 to limsud do readln(f,labirint[i]); writeln; writeln('labirintul propus arata astfel:'); writeln; for i:=1 to limsud do writeln(labirint[i]); writeln; writeln('precizati pozitia initiala'); Repeat write('linia (1..',limsud:2,')='); readln(startlat); write('coloana (1..',limest:2,')='); readln(startlong); writeln; Until labirint[startlat,startlong]='.'; {Analiza caii de iesire} gasit:=false;

gasesc(startlat,startlong); {Secventa de afisare a labirintului} writeln; writeln('Labirintul rezolvat arata astfel:'); writeln; for i:=1 to limsud do begin for j:=1 to limest do begin if labirint[i,j]='H' then textcolor(green) else if labirint[i,j]='o' then textcolor(red) else if labirint[i,j]='^' then textcolor(9) else textcolor(white); write(labirint[i,j]); end; writeln; end; if not gasit then writeln('nu exista cale de iesire din labirint'); readln; End.

Prin instruciunea labirint[lat,long]:=pas m asigur c parcelele prin care am trecut sunt marcate, evitnd posibila nvrtire n cerc, iar prin labirint[lat,long]:=marcat se evideniaz fiecare pas parcurs pe calea spre ieire.n acest fel n desenul final al labirintului apar trasate att calea spre ieire din labirint (marcat prin ^) ct i coridoarele parcurse inutil (marcate prin o) n timpul cutrii.

Pentru exemplul pe care l-am artat la labirintul iniial voi prezenta forma final dup ce l-am parcurs pentru a gsi o ieire: coordonate(2,2)

H H H H H H H H

H ^ H . H . . H

H ^ ^ . H . H H

H H ^ H ^ ^ ^ H

H H ^ ^ ^ H ^ H

H H H H o H ^ H

H o o o o H ^ H

H o H H H ^ ^ H

H o H . H ^ H H

H o H . H ^ H H

H H . . H ^ ^ ^

H H H H H H H H

Observaii: -citirea labirintului se poate face att din fiier ct i de la tastatur; -am preferat citirea din fiier deoarece timpul de construcie a labirintului este mai scurt, iar o eventual citire de la tastatur a labirinturilor care au coordonate (sud,est) mai mari decat 12 este foarte dificil, iar ansa de a introduce greit caracterele este foarte mare; -am specificat in program c algoritmul funcioneaz pentru coordonate (sud,est) pn la 20, dar nu este nici o problem dac se dorete introducerea unor coordonate mai mari, chiar mult mai mari ; -citirea de la tastatur apare i ea n algoritm dar este pus ntre apostrofuri;

Note Realizarea acestui proiect a fost ntocmit de elevul Neghin Bogdan Nicolae, elev n clasa a XII-a C,al Colegiului Naional Vasile Lucaciu, din Baia-Mare, Maramure.

Surse de inspiraie/documentaia: -Manualul pentru clasa a XI-XII-a Informatic- Programarea calculatoarelor. -Internet Explorer. Acest proiect a fost realizat n programul Microsoft Office Word 2003. Algoritmul Labirintul a fost realizat cu ajutorul programului: Borland Pascal 7.0.

Sfrit

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