Sunteți pe pagina 1din 1

Algoritmul lui Lee este folosit pentru determinarea ieșirii dintr-un labirint sau

în alte probleme similare cu aceasta.

Considerăm un labirint reprezentat printr-o matrice cu n linii și m coloane, în


care elementele egale cu 0 reprezintă camere libere, iar cele egale cu 1 reprezintă
camere blocat. Un mobil se deplasează prin labirint, trecând dintr-o cameră în alta
dacă acestea se învecinează pe linie sau pe coloană. Determinați numărul minim de
pași pe care îi face mobilul pentru a ieși din labirint (a ajunge pe chenarul
matricei).

Pentru rezolvarea problemei procedăm astfel:

marcăm în matrice elementele libere cu 0, iar obstacolele cu -1 (valorile pozitive


sunt folosite în alt scop)
marcăm poziția de start cu 1
pentru fiecare k=1,2,3,...
analizăm elementele marcate cu valoarea k și marcăm cu k+1 toți vecinii săi care
sunt liberi și nemarcați
dacă pentru un anumit k nu găsim niciun element egal cu k, ne oprim

Implementare C++
Pentru mai multe modalități de implementare a cozii vezi articolul Fill cu coadă.
În continuare vom folosi varianta cu containerul din STL.

void Lee(int istart ,int jstart)


{
queue<pair<int,int>> Q;
//initializare coada
Q.push(make_pair(istart , jstart));
//marcare pozitie de start
A[istart][jstart] = 1;
while(! Q.empty()) // cat timp coada este nevida
{
int i = Q.front().first, j = Q.front().second; // determinam elementul de
la inceputul cozii
for(int k = 0 ; k < 4 ; k ++)
{
int iv = i + di[k], jv = j + dj[k]; // coordonatele vecinului
if(iv >= 1 && iv <= n && jv >= 1 && jv <= m // element în matrice
&& A[iv][jv] == 0) // element liber si nemarcat
{
// marcam elementul vecin cu o valoare mai mare
A[iv][jv] = A[i][j] + 1;
// il adaugam in coada
Q.push(make_pair(iv , jv));
}
}
Q.pop(); // eliminam din coada
}
}

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