Sunteți pe pagina 1din 2

Algoritmul de parcurgere in latime (Lee)

Algoritmul lui Lee presupune doi paşi importanţi:


1. Primul şi poate cel mai important pas este folosirea unei Cozi, sub forma unui vector de
structuri (de preferabil), care va menţine toţi paşii pe care o să-i facem de acum în colo. În
această coadă se pun, pentru fiecare pas, locurile care s-au marcat la punctul anterior.
2. Se marchează cu numere consecutive toate locurile posibile prin care putem trece, parcurgând
în ordine elementele cozii, până când nu mai putem marca, sau am ajuns la final.

Problema model:
Intr-un labirint se află un șoricel şi o bucată de cașcaval. Şoricelul doreşte să ajungă la caşcaval
efectuând un număr minim de paşi. La un pas şoricelul se poate deplasa în una dintre poziţiile
învecinate (sus, jos, stânga, dreapta), evident dacă acolo este culoar de trecere.
Exemplu:
6 10 Drumul este colorat
1111011111
1101011001 1111011111
1101011111 1101011001
1100000000 1101011111
1111010011 1100000000
1111010011 1111010011
4366 1111010011
Se va afișa 6

Listingul programului

#include<fstream>
using namespace std;
int a[100][100],v[100][100];
int m,n;
//m,n dimensiunile matricii
const int dx[]={0,0,0,1,-1};
const int dy[]={0,1,-1,0,0}; //am presupus ca se poate merge in 4 directii: sus, jos, st,dr
int cx[400],cy[400]; //coada

int lee(int xi,int yi,int xf,int yf)


{
int f,b,x,y,xx,yy,i;
b=1;
f=1;
cx[f]=xi;
cy[f]=yi;
while (f<=b)
{
x=cx[f];
y=cy[f];
f++;
for (i=1;i<=4;i++)
{
xx=x+dx[i];
yy=y+dy[i];
Algoritmul de parcurgere in latime (Lee)

if (xx==xf&&yy==yf)
return a[x][y]+1;

//nu fac bordare si verific daca coordonatele se afla in matrice


if (xx>0&&yy>0&&xx<=n&&yy<=m)
{
//verific daca locul respectiv e liber si daca casuta nu a mai fost vizitata
if (v[xx][yy]==0&&a[xx][yy]==0)
{
a[xx][yy]=a[x][y]+1;
b++;
cx[b]=xx;
cy[b]=yy;
}
}
}
}
return a[xf][yf];
}

int main()
{
int i,j,xi,yi,xf,yf;
//xi yi=pozitiile initiale
//xf,yf=pozitiile finale

ifstream cin("lee.in");
ofstream cout("lee.out");

cin>>n>>m;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
cin>>v[i][j];

cin>>xi>>yi>>xf>>yf;
cout<<lee(xi,yi,xf,yf)<<'\n';

Aplicații :

http://www.infoarena.ro/problema/alee (problema clasica Algoritm LEE)


http://www.infoarena.ro/problema/insule (combinație LEE+ FILL)
http://www.infoarena.ro/problema/muzeu
http://www.infoarena.ro/problema/taxa
http://www.infoarena.ro/problema/gheizere
http://www.infoarena.ro/problema/tsunami
http://www.infoarena.ro/problema/ferma3
http://varena.ro/problema/oras
http://varena.ro/problema/biscuit
http://varena.ro/problema/ozn
http://varena.ro/problema/enclave
http://varena.ro/problema/panda

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