diff --git a/MusinAA/task2/strategyObjects/AStar.py b/MusinAA/task2/strategyObjects/AStar.py new file mode 100644 index 0000000..7b1b45e --- /dev/null +++ b/MusinAA/task2/strategyObjects/AStar.py @@ -0,0 +1,9 @@ +from task2.strategyObjects.pathFindingStrategy import PathFindingStrategy + +from task2.mazeObjects.maze import Maze +from task2.mazeObjects.cell import Cell + +class AStar(PathFindingStrategy): + """Алгоритм с эвристикой (etc. манхэттенское расстояние) – компромисс между скоростью и оптимальностью.""" + def findPath(self, maze: Maze, start: Cell, exit: Cell): + ... \ No newline at end of file diff --git a/MusinAA/task2/strategyObjects/BFS.py b/MusinAA/task2/strategyObjects/BFS.py new file mode 100644 index 0000000..a76f3a5 --- /dev/null +++ b/MusinAA/task2/strategyObjects/BFS.py @@ -0,0 +1,42 @@ +from task2.strategyObjects.pathFindingStrategy import PathFindingStrategy + +from task2.mazeObjects.maze import Maze +from task2.mazeObjects.cell import Cell + +import queue + +class BFS(PathFindingStrategy): + """Поиск в ширину – гарантирует кратчайший путь по количеству шагов.""" + def findPath(self, maze: Maze, start: Cell, exit: Cell): + visited = dict() + parents = dict() + q = queue.Queue() + + q.put(start) + visited[start] = 0 + parents[start] = None + + while not q.empty(): + current = q.get() + + # Условие нахождение выхода + if current == exit: break + + # Перебор соседей + for hood in maze.getNeighbors(current): + if hood in visited: + continue + visited[hood] = visited[current] + 1 + parents[hood] = current + q.put(hood) + return self.restorePath(parents, start, exit) + + def restorePath(self, parents: dict, start: Cell, exit: Cell) -> list[Cell]|None: + path = [] + current = exit + while current: + path.append(current) + if current not in parents: + return [] + current = parents[current] + return path[::-1] \ No newline at end of file diff --git a/MusinAA/task2/strategyObjects/DFS.py b/MusinAA/task2/strategyObjects/DFS.py new file mode 100644 index 0000000..707be20 --- /dev/null +++ b/MusinAA/task2/strategyObjects/DFS.py @@ -0,0 +1,9 @@ +from task2.strategyObjects.pathFindingStrategy import PathFindingStrategy + +from task2.mazeObjects.maze import Maze +from task2.mazeObjects.cell import Cell + +class DFS(PathFindingStrategy): + """Поиск в глубину – быстрый, но не обязательно кратчайший.""" + def findPath(self, maze: Maze, start: Cell, exit: Cell): + ... \ No newline at end of file diff --git a/MusinAA/task2/strategyObjects/__init__.py b/MusinAA/task2/strategyObjects/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/MusinAA/task2/strategyObjects/pathFindingStrategy.py b/MusinAA/task2/strategyObjects/pathFindingStrategy.py new file mode 100644 index 0000000..0a1cb92 --- /dev/null +++ b/MusinAA/task2/strategyObjects/pathFindingStrategy.py @@ -0,0 +1,12 @@ +from abc import ABC, abstractmethod + +from task2.mazeObjects.maze import Maze +from task2.mazeObjects.cell import Cell + +class PathFindingStrategy(ABC): + """Интерфейс PathFindingStrategy с методом findPath(maze, start, exit), + возвращающим список клеток пути (от старта до выхода включительно) или пустой список, если пути нет.""" + + @abstractmethod + def findPath(self, maze: Maze, start: Cell, exit: Cell): + """Возвращает список клеток пути от старта до выхода включительно. Пути нет - пустой список.""" \ No newline at end of file