2026-05-16 16:20:59 +00:00
|
|
|
|
from task2.strategyObjects.pathFindingStrategy import PathFindingStrategy
|
2026-05-16 21:48:23 +00:00
|
|
|
|
from task2.strategyObjects.util import restorePath
|
2026-05-16 16:20:59 +00:00
|
|
|
|
|
|
|
|
|
|
from task2.mazeObjects.maze import Maze
|
|
|
|
|
|
from task2.mazeObjects.cell import Cell
|
2026-05-23 09:02:30 +00:00
|
|
|
|
from task2.mazeObjects.path import Path
|
2026-05-16 16:20:59 +00:00
|
|
|
|
|
|
|
|
|
|
import queue
|
|
|
|
|
|
|
|
|
|
|
|
class BFS(PathFindingStrategy):
|
2026-05-16 21:45:29 +00:00
|
|
|
|
"""Поиск в ширину – гарантирует кратчайший путь по количеству шагов.
|
|
|
|
|
|
Возвращает None, если пути нет"""
|
2026-05-23 09:02:30 +00:00
|
|
|
|
def findPath(self, maze: Maze, start: Cell, exit: Cell) -> Path:
|
2026-05-16 16:20:59 +00:00
|
|
|
|
visited = dict()
|
|
|
|
|
|
parents = dict()
|
|
|
|
|
|
q = queue.Queue()
|
|
|
|
|
|
|
|
|
|
|
|
q.put(start)
|
|
|
|
|
|
visited[start] = 0
|
|
|
|
|
|
parents[start] = None
|
|
|
|
|
|
|
2026-05-25 00:00:00 +00:00
|
|
|
|
found_exit = False
|
2026-05-16 16:20:59 +00:00
|
|
|
|
while not q.empty():
|
|
|
|
|
|
current = q.get()
|
|
|
|
|
|
|
|
|
|
|
|
# Условие нахождение выхода
|
2026-05-25 00:00:00 +00:00
|
|
|
|
if current.isExit:
|
|
|
|
|
|
found_exit = True
|
|
|
|
|
|
break
|
2026-05-16 16:20:59 +00:00
|
|
|
|
|
|
|
|
|
|
# Перебор соседей
|
|
|
|
|
|
for hood in maze.getNeighbors(current):
|
|
|
|
|
|
if hood in visited:
|
|
|
|
|
|
continue
|
|
|
|
|
|
visited[hood] = visited[current] + 1
|
|
|
|
|
|
parents[hood] = current
|
|
|
|
|
|
q.put(hood)
|
2026-05-23 09:02:30 +00:00
|
|
|
|
|
2026-05-25 00:00:00 +00:00
|
|
|
|
if not found_exit:
|
|
|
|
|
|
path_list = None
|
|
|
|
|
|
else:
|
|
|
|
|
|
path_list = restorePath(parents, exit)
|
|
|
|
|
|
return Path(path_list, len(visited))
|