Sunteți pe pagina 1din 3

Generarea tuturor solutiilor de iesire din labirint

Se cauta toate posibilitatile unui traseu printr-un labirint, intre doua pozitii, initiala si finala, fara a trece de doua pri prin aceeasi pozitie. Labirintul are dimensiunea nxm. Pozitia initiala este data de x1-numarul liniei- si y1- numarul coloanei- care se comunica de la tastatura. Pozitia finala corespunzatoare iesiri din labirint este data de x2-nr liniei- si y2-nr coloanei- care vor fi determinate in urma gasirii traseului. Deplasarea in labirint se poate face numai ortogonal( pe verticala si orizontala), nu si pe doagonala.

Solutia problemei este data de multimea cu t elemente ,x1 ,x2, , xt- care se memoreaza in stiva. Numarul de elemente ale solutiei depinde de Solutia gasita. Elementul solutiei xk reprezinta coordonatele i si j ale patratului in care se deplaseaza o persoana in labirint si se memoreaza pe nivelul k al stivei st. Pentru a inregistra traseul strabatut , elementele stivei vor fi de tip inregistrare cu doua campuri, x si y, corespunzatoare celor doua coordinate ale patratului. Stiva va avea dimensiunea t corespunzatoare parcurgerii intregului traseu, de la patratul de plecare pana la patratul de sosire, si va contine, in ordine, coordonatele tuturor patratelor de pe traseul de parcurgere: st[1].x si st[1].y corespund celui de-al doilea patrat in care se trece, , st*t+.x si st*t+.y corespund patratului de sosire,prin care se iese din labirint.

#include<fstream.h> struct element{int x,y;} element d[5]={{0,0},{-1,0},{0,1},{1,0},{0,-1}}; int n,m,k,ev,as,p[100],este=0,L[10][10]; typedef element stiva[100]; stiva st; fstream f(labirint1.txt,ios::in); void init() {p[k]=0} int succesor()

{if (p[k]<4) {p[k]=p[k]+1;st[k].x=st[k-1].x+d[p[k]].x; st[k].y=st[k-1].y+d[p[k]].y;return1;} else return o;} int valid() {int x=st[k-1].x,y=st[k-1].y; for (int i=1;i<k;i++) if (st[k].x==st[i].x && st[k].y==st[i].y) return 0; switch (p[k]) {case 1:if (L[x][y] & 1) return 1;break; case 2:if (L[x][y] & 2) return 1;break; case 3:if (L[x][y] & 4) return 1; break; case 4:if (L[x][y] & 8) return 1;} return 0; int solutie() {return k>2 && L[st[k].x] [st[k].y]==16;} void tipar() {int I;este=1; for (i=1;i<k;i++) cout<<st*i+.x<<,<<st*i+.y<< ; cout<<endl;} void bt() void main() (int i,j; f>>n>>m; for (i=1;i<=n;i++) for(j=1;j<=m;j++) f>>L[i][j]; cout<<intrarea in labirint: <<endl; cout<<x= ; cin>>i; st*1+.x=i; cout<<y= ; cin>>j; st*1+.y=j;

for (i=1;i<=n;i++) {L[i][0]=16; L[i][m+1]=16;} for (i=1;i<=n;i++) {l[0][i]=16; l[n+1][i]=16;} bt();if (!este) cout<<nu exista solutii;-