BFS i DFS - Pronalaženje putanje kroz lavirint
Uvod
Svi putevi vode u ....
Razmotrićemo problem pronalaženja putanje kroz lavirint (pri čemu ćemo za primer uzeti tabelu sa 10 x 10 polja).
Sa svakog polja je dozvoljeno prelaziti na susedna polja: napred, nazad, levo ili desno, pod uslovom da dato polje nije blokirano (siva polja na slikama), a naš zadatak je da iznađemo postupak preko koga računar može ustanoviti da li se sa zelenog polja, krećući se po navedenim pravilima, može preći na narandžasto polje. *
Kada rešimo 'prvi zadatak', osvrnućemo se i na postupak za pronalaženje svih putanja.
Pronalaženje putanja
Budući da je članak namenjen mlađim čitaocima, ovoga puta ćemo se pozabaviti opštim idejama, na jednostavan način (nekom drugom prilikom, predstavićemo algoritme za pretragu detaljnije).
Pošto je prvi zadatak - ustanoviti da li je "ikako moguće" stići do ciljanog polja, praktično rešenje podrazumeva postepeno i sistematično ispitivanje susednih polja, "u širinu", "u svim pravcima", a kasnije, ako se ustanovi da postoji (bar jedna) putanja između početnog i krajnjeg polja, primenićemo algoritam koji prati putanje preko svih "susednih polja" koja zapravo povezuju početno i krajnje polje.
Za početak, potrebno je označiti polja brojevima:
- početno polje će dobiti vrednost 0 (udaljenost polja "od samog sebe" je, naravno, 0)
- polja koja nisu obiđena dobiće vrednost -1 (šifra za "neobiđena polja")
- sivi "sanduci" će dobiti vrednost -2 (šifra za "nedostupna polja na koja se ne može prelaziti")
BFS - Breadth First Search (pretraga "u širinu")
U prvom koraku, sa početnog polja prelazi se na sva dostupna susedna polja, i upisuje se vrednost 1 (koja odgovara udaljenosti "plavih" polja od početnog polja (shodno ranije navedenim pravilima)).
Sa polja udaljenosti 1, prelazi se na polja udaljenosti 2 ....
Vrednost 2 se upisuje u polja, i potom se postupak 'ponavlja':
- Sa "dvojki" se prelazi na "trojke".
- Sa "trojki" se prelazi na "četvorke".
- Sa "četvorki" se prelazi na "petice".
- Sa "petica" se prelazi na "šestice".
- Sa "šestica" se prelazi na "sedmice".
- Sa "sedmica" se prelazi na "osmice" ....
.... i, na kraju, sa "osmica" se prelazi na polja udaljenosti devet (koraka).
Jedno od označenih polja je "narandžasto" (traženo) polje, i stoga se na ovom mestu pretraga zaustavlja.
DFS - Depth First Search (pretraga "u dubinu")
Zarad pronalaženja svih putanja, potrebno je ispratiti sve kombinacije koje se dobijaju kretanjem unazad, od narandžastog polja, preko susednih polja manje udeljenosti, sve do početnog polja.
Da pojasnimo dodatno:
- do označenog polja sa udaljenošću 9, može se doći sa bilo kog od susednih polja udaljenosti 8, ALI - samo sa susednih polja udaljenosti 8 (ne i sa ostalih polja koja su označena sa "8")
- do nekog od susednih polja udaljenosti 8, može se doći sa bilo kog od susednih polja udaljenosti 7
- do nekog od susednih polja udaljenosti 7, može se doći sa bilo kog od susednih polja udaljenosti 6 ....
.... nakon čega slede prelasci 6 => 5, 5 => 4, 4 => 3, 3 => 2, 2 => 1, redom - do početnog polja.