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 } }