Inteligentny_Wozek/wyszukiwanie.py

60 lines
1.5 KiB
Python

class Stan:
def __init__(self, x, y, kierunek):
self.x = x
self.y = y
self.kierunek = kierunek
class Wezel:
def __init__(self, stan):
self.stan = stan
def poprzednik(wezel):
# gora -> prawo -> dol -> lewo | obrot w prawo
# gora -> lewo -> dol -> prawo | obrot w lewo
# 0 gora 1 prawo 2 dol 3 lewo
y = wezel.stan.x
x = wezel.stan.y
obrot_w_prawo = Stan(x, y, (wezel.stan.kierunek + 1) % 4)
obrot_w_lewo = Stan(x, y, (wezel.stan.kierunek - 1) % 4)
if wezel.stan.kierunek == 0:
y -= 1
elif wezel.stan.kierunek == 1:
x += 1
elif wezel.stan.kierunek == 2:
y += 1
elif wezel.stan.kierunek == 3:
x -= 1
wezly = [obrot_w_prawo, obrot_w_lewo]
ruch_w_przod = Stan(x, y, wezel.stan.kierunek)
# sprawdzenie czy nie wyjdzie poza plansze
if 0 <= x <= 916 and 0 <= y <= 916:
wezly.append(ruch_w_przod)
return wezly
def wyszukiwanie_bfs(stan_poczatkowy, stan_docelowy):
pierwszy_wezel = Wezel(stan_poczatkowy)
fringe = [pierwszy_wezel]
odwiedzone = list()
while fringe:
# kolejka
wezel = fringe.pop(0)
if stan_docelowy.x == wezel.stan.x and stan_docelowy.y == wezel.stan.y:
return odwiedzone
odwiedzone.append(wezel)
for stan in poprzednik(wezel):
if wezel not in fringe and stan not in odwiedzone:
nowy_wezel = Wezel(stan)
fringe.append(nowy_wezel)