from collections import deque from typing import List, Dict from .path_finding_strategy import PathFindingStrategy class BFSStrategy(PathFindingStrategy): """Поиск в ширину (BFS) - гарантирует кратчайший путь""" def __init__(self): self._visited_count = 0 @property def name(self) -> str: return "BFS" def find_path(self, maze, start, exit_cell) -> List: """Находит путь с помощью BFS""" if not start or not exit_cell: return [] # Очередь для BFS queue = deque([start]) # Множество посещенных клеток visited = {start} # Словарь для восстановления пути parent = {start: None} self._visited_count = 0 while queue: current = queue.popleft() self._visited_count += 1 # Нашли выход if current == exit_cell: return self._reconstruct_path(parent, exit_cell) # Проверяем всех соседей for neighbor in maze.get_neighbors(current): if neighbor not in visited: visited.add(neighbor) parent[neighbor] = current queue.append(neighbor) # Путь не найден return [] def _reconstruct_path(self, parent: Dict, end) -> List: """Восстанавливает путь от终点 до старта""" path = [] current = end while current is not None: path.append(current) current = parent.get(current) return list(reversed(path))