class SearchSpace: def __init__(self): self.grid = [['1']*10 for _ in range(10)] # create a 10x10 grid of cells for r, c in [(2,2), (2,3), (3,2), (3,3), (8,2), (8,3), (9,2), (9,3), (2,8), (2,9), (3,8), (3,9), (8,8), (8,9), (9,8), (9,9)]: self.grid[r][c] = 'X' # set the cells with a shelf to not passable def is_passable(self, x, y): return 0 <= x < 10 and 0 <= y < 10 and self.grid[y][x] != 'X' 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, search_space): # 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, search_space): pierwszy_wezel = Wezel(stan_poczatkowy) fringe = [pierwszy_wezel] odwiedzone = set() while fringe: wezel = fringe.pop(0) if stan_docelowy.x == wezel.stan.x and stan_docelowy.y == wezel.stan.y: return odwiedzone odwiedzone.add(wezel.stan) for stan in poprzednik(wezel, search_space): if stan not in odwiedzone: nowy_wezel = Wezel(stan) fringe.append(nowy_wezel) odwiedzone.add(stan) return odwiedzone