Technikák
összehasonlítása I.
Backtraking
/ Divide et impera
Feladatok:
1. Adott egy labirintus, melyet egy a[1..n][1..m]
bináris mátrixxal (1-fal, 0-szabad
)modellezünk, valamint adottak egy egér
(xe,
ye) és
egy darab sajt (xs, ys)
koordinátái
ebben a mátrixban. Feltételezve, hogy a feladatnak mindig
van megoldása, írjunk programot, mely meghatározza
az egértől a sajthoz vezető legrövidebb utat , tudva azt,
hogy a labirintusban négy irányba ( fel, le, jobbra,
balra ) lehet közlekedni.
Backtracking kód: kigeneráljuk az
összes
hurokmentes utat, amely az egértől a sajthoz vezet, majd
kiválasztjuk közülük a legrövidebbet.
back_egér(x,y,k)
út[k].x = x
út[k].y = y
ha x == xs és y == ys
akkor // a sajthoz érkeztünk
ha k < kmin
akkor
// rövidebb utat találtunk, mint az eddigi legjobb
kmin = k
minden i = 1, k végezd
útmin[i] =
út[i]
vége minden
vége ha
különben
a[x][y] =
1
// a hurkok elkerülése végett
ha a[x-1][y] == 0 akkor back_egér(x-1,y,k+1)
vége ha
ha a[x][y+1] == 0 akkor back_egér(x,y+1,k+1)
vége ha
ha a[x+1][y] == 0 akkor back_egér(x+1,y,k+1)
vége ha
ha a[x][y-1] == 0 akkor back_egér(x,y-1,k+1)
vége ha
a[x][y] =
0
// visszalépés előtt visszaállítjuk a
szabad utat
vége ha
vége back_egér
Divide et impera kód: Az egértől a sajthoz vezető
legrövidebb út meghatározása visszavezethető
az egérrel szomszédos szabad
pozíciókból induló – sajthoz vezető –
legrövidebb utak megtalálására.
Miután ezek rendelkezésre állnak, a
legrövidebbhez hozzáadva egyet meg is van a keresett
út hossza.
divide_egér
(x, y)
ha x
== xs és y == ys akkor
return
0
// a sajthoz érkeztünk
vége ha
h[1] =
h[2] =
h[3] =
h[4] =
n*m
a[x][y] =
1
// a hurkok elkerülése végett
ha
a[x-1][y] == 0 akkor h[1]=divide_egér(x-1,y)
vége ha
ha
a[x][y+1] == 0 akkor h[2]=divide_egér(x,y+1)
vége ha
ha
a[x+1][y] == 0 akkor h[3]=divide_egér(x+1,y)
vége ha
ha
a[x][y-1] == 0 akkor h[4]=divide_egér(x,y-1)
vége ha
a[x][y] =
0
// visszalépés előtt visszaállítjuk a
szabad utat
min_irány =
minimum(h)
//
eltároljuk az addigi legkisebb irányt,
ha
h[min_irány] < n*m akkor
irány[x][y] = min_irány
különben
irány[x][y] =
-1
// zsákutcába értünk
vége ha
return
h[min_irány] +1
vége
divide_egér
minimum ( h[])
mini = 0
minden i = 1,4 vegezd
ha (h[i] < h[mini]) mini = i;
return mini;
vege minimum