ОПИСАНИЕ ЗАДАЧИ И ВЫБРАННЫХ ПАТТЕРНОВ

Цель работы — разработать систему поиска пути в лабиринте с использованием 
оопп и паттернов проектирования. 

В работе были использованы следующие паттерны:

Strategy — для реализации алгоритмов поиска пути (BFS, DFS, A*, Dijkstra).
Позволяет менять алгоритм без изменения кода основного класса MazeSolver.

Builder — для создания лабиринта из текстового файла.
Отделяет логику загрузки данных от основной системы.
'''mermaid

classDiagram
class Cell {
+x
+y
+is_wall
+is_start
+is_exit
+weight
+isPassable()
}

class Maze {
+width
+height
+start
+exit
+getCell()
+getNeighbors()
+getWeightedNeighbors()
}

class MazeBuilder {
+buildFromFile()
}

class TextFileMazeBuilder
MazeBuilder <|-- TextFileMazeBuilder

class PathFindingStrategy {
+findPath()
}

class BFSStrategy
class DFSStrategy
class AStarStrategy
class DijkstraStrategy

PathFindingStrategy <|-- BFSStrategy
PathFindingStrategy <|-- DFSStrategy
PathFindingStrategy <|-- AStarStrategy
PathFindingStrategy <|-- DijkstraStrategy

class MazeSolver {
+setStrategy()
+solve()
}

MazeSolver --> PathFindingStrategy
Maze --> Cell
'''
ЛИСТИНГИ КЛЮЧЕВЫХ КЛАССОВ

В проекте реализованы основные классы:
Cell — хранение информации о клетке лабиринта
Maze — структура лабиринта и работа с соседями
MazeSolver — запуск поиска пути
PathFindingStrategy — интерфейс алгоритмов
BFSStrategy, DFSStrategy, AStarStrategy, DijkstraStrategy — реализации алгоритмов
TextFileMazeBuilder — загрузка лабиринта из файла
SearchStats — хранение статистики

РЕЗУЛЬТАТЫ ЭКСПЕРИМЕНТОВ

Алгоритмы тестировались на разных лабиринтах: small, medium, large, empty, no_exit.

Сравнивались:

время выполнения
количество посещённых клеток
длина найденного пути

Результаты в общем виде:

BFS — гарантирует кратчайший путь, но посещает много клеток
DFS — быстрый, но не гарантирует оптимальный путь
A* — самый быстрый в большинстве случаев за счёт эвристики
Dijkstra — стабильный, но медленнее A* на больших лабиринтах

АНАЛИЗ ЭФФЕКТИВНОСТИ И ПАТТЕРНОВ

Результаты показали, что A* является наиболее эффективным алгоритмом на больших данных,
так как использует эвристику и уменьшает количество проверяемых клеток.

BFS всегда находит оптимальный путь, но работает медленнее из-за полного обхода пространства.

DFS быстрее по времени, но не гарантирует лучший результат.

Dijkstra корректно работает с весами, но в данной задаче часто уступает A*.

Паттерн Strategy позволил легко переключать алгоритмы без изменения основной логики программы.
Паттерн Builder упростил создание лабиринтов и отделил загрузку данных от логики поиска.

ВЫВОДЫ

В ходе работы была создана гибкая система поиска пути в лабиринте с использованием ООП 
и паттернов проектирования. Благодаря Strategy алгоритмы стали независимыми и легко 
заменяемыми. Благодаря Builder упростилась работа с созданием и загрузкой лабиринтов.
В целом, архитектура получилась расширяемой: можно легко добавить новый алгоритм или тип 
лабиринта без переписывания существующего кода.
Таким образом, наиболее сбалансированным алгоритмом для поиска пути в лабиринте является A*,
так как он обеспечивает:

высокую скорость работы,
оптимальность результата,
минимальное количество исследуемых состояний.

Алгоритмы BFS и Dijkstra гарантируют оптимальность, но проигрывают по производительности, 
а DFS является самым быстрым, но не гарантирует качество решения.