1. Цель работы Разработать расширяемую программу для поиска пути в лабиринте, поддерживающую загрузку карты из файла, выбор алгоритма поиска, сбор статистики и сравнение эффективности различных стратегий. В ходе работы применены паттерны проектирования для разделения ответственности между компонентами системы и повышения гибкости архитектуры. 2. Постановка задачи Лабиринт задаётся в текстовом файле символами: # — стена пробел — проходимая клетка S — стартовая позиция E — выход Программа должна: загружать лабиринт из файла; строить внутреннюю модель представления; находить путь от старта до выхода; поддерживать выбор алгоритма поиска; собирать статистику работы алгоритмов; визуализировать результат; выполнять сравнительный анализ стратегий. 3. Использованные паттерны проектирования 3.1 Builder Паттерн Builder применяется для создания объекта лабиринта из текстового файла. Он инкапсулирует процесс парсинга, валидации и построения структуры данных. Преимущества: отделение логики загрузки от логики использования; возможность добавления новых форматов (JSON, бинарные файлы); упрощение расширения системы. 3.2 Strategy Паттерн Strategy используется для реализации различных алгоритмов поиска пути. Реализованы следующие стратегии: BFS; DFS; A*. Преимущества: возможность переключения алгоритма во время выполнения; отсутствие зависимости MazeSolver от конкретной реализации; лёгкое добавление новых алгоритмов. 3.3 Observer Паттерн Observer применяется для уведомления интерфейса о событиях выполнения программы (например, нахождение пути). Преимущества: разделение логики поиска и отображения; возможность замены интерфейса без изменения алгоритмов; расширяемость системы визуализации. 3.4 Command (дополнительно) Паттерн Command используется для представления действий пользователя как объектов (например, перемещение и отмена хода). Преимущества: поддержка undo/redo; хранение истории действий; разделение команд и логики исполнения. 4. Архитектура системы Система состоит из следующих основных компонентов: Cell — описание клетки лабиринта; Maze — структура лабиринта и логика соседей; MazeBuilder — загрузка лабиринта из файла; PathFindingStrategy — интерфейс алгоритмов поиска; реализации стратегий: BFS, DFS, A*; MazeSolver — оркестратор поиска и сбор статистики; SearchStats — структура результатов; ConsoleView — визуализация результата; Command (опционально) — управление действиями пользователя. 5. Описание ключевых компонентов Cell Хранит координаты клетки и её тип (стена, старт, выход). Определяет проходимость клетки. Maze Представляет лабиринт в виде двумерного массива клеток и предоставляет методы доступа к соседним узлам. TextFileMazeBuilder Отвечает за чтение текстового файла и построение объекта Maze. BFS / DFS / A* Реализуют разные стратегии поиска пути: BFS — гарантирует кратчайший путь; DFS — быстрый, но не оптимальный; A* — использует эвристику и уменьшает число посещённых клеток. MazeSolver Запускает выбранный алгоритм, измеряет время выполнения и формирует статистику. SearchStats Содержит: время выполнения; количество посещённых клеток; длину найденного пути. ConsoleView Отвечает за отображение лабиринта и найденного пути в консоли. 6. Экспериментальная часть 6.1 Тестовые данные Для анализа использовались следующие типы лабиринтов: небольшой 10×10 с простым маршрутом; средний 50×50 с наличием тупиков; большой 100×100 со сложной структурой; пустой лабиринт без стен; лабиринт без решения. 6.2 Методика измерений Для каждой комбинации лабиринта и алгоритма выполнялось несколько запусков. Фиксировались следующие показатели: время выполнения (мс); количество посещённых клеток; длина пути. Результаты сохранялись в CSV-файл для последующего анализа. 7. Анализ результатов BFS Обеспечивает нахождение кратчайшего пути при равных весах переходов. Однако может исследовать значительное количество клеток. DFS Быстро находит решение в некоторых случаях, но не гарантирует оптимальность пути и может исследовать нерелевантные области. A* Использует эвристику (Манхэттенское расстояние), что позволяет существенно сократить количество посещённых узлов и ускорить поиск. Лабиринт без решения Во всех алгоритмах происходит полный или частичный обход доступной области, после чего возвращается отсутствие пути. Вывод по алгоритмам BFS — оптимален по длине пути; DFS — прост, но нестабилен; A* — наиболее эффективен по числу посещений и времени работы. 8. Роль ООП и паттернов Использование ООП и паттернов проектирования позволило: разделить систему на независимые компоненты; упростить расширение алгоритмов; отделить визуализацию от логики поиска; обеспечить возможность добавления новых форматов данных и алгоритмов. Без использования паттернов код был бы менее структурирован и сложнее в сопровождении. 9. Вывод В рамках работы была реализована система поиска пути в лабиринте с возможностью выбора алгоритма и анализа их эффективности. Применение паттернов Builder, Strategy, Observer и Command позволило создать гибкую и расширяемую архитектуру. Экспериментальная часть показала, что выбор алгоритма существенно влияет на количество посещённых клеток и время выполнения.