Че за код-1
.docxЭтот код – это Windows Forms-приложение на C#, которое создает поле (сетка) с препятствиями и реализует алгоритмы поиска пути между двумя точками. Основная идея – найти маршрут от случайно установленной стартовой точки (S) до финишной точки (F). При этом реализовано два подхода:
Классический обход волнами (BFS) – базовая реализация, где из стартовой точки «волной» распространяется поиск до нахождения финиша. Каждая ячейка, в которую распространяется волна, получает отметку (цифру, меняющуюся от 1 до 3), а найденный путь восстанавливается по обратным переходам.
Поиск пути с минимальным числом поворотов – более продвинутая версия, где при поиске учитывается не только достижимость ячейки, но и направление движения. Для этого введены:
Перечисление Direction (None, Left, Right, Up, Down) для определения направления движения.
Класс PathNode, который хранит координаты, направление, количество поворотов и ссылку на родительский узел для восстановления маршрута.
Метод FindPathMinTurns, реализующий поиск в ширину (BFS) с учетом направления и подсчетом числа поворотов. Он использует очередь для перебора возможных ходов и словарь для запоминания минимального числа поворотов, необходимого для достижения конкретной ячейки с заданным направлением.
Помимо алгоритмов поиска, в коде реализовано:
Инициализация поля: Метод NewPole() создает двумерный массив, где через определенные интервалы расставляются препятствия (отмечаются символом " o" и закрашиваются в серый цвет), а также устанавливаются границы поля (левый, правый, верхний, нижний края – закрашены в черный цвет). Дополнительно запоминаются точки для отрисовки рамки вокруг препятствий.
Размещение стартовой и финишной точек: Метод AddStart() (вместе с AddFinish(), который в текущей версии просто-заглушка) выбирает случайное место на поле для установки точки старта (S) и финиша (F), проверяя, чтобы выбранная ячейка была свободной.
Обработка расширения волны (обхода): Метод AddFront() проходит по всем текущим «фронтовым» ячейкам, проверяя соседние (слева, справа, сверху, снизу). Если соседняя ячейка свободна, в нее записывается значение текущего фронта и она добавляется во второй фронт (Front2). Если соседняя ячейка – это финиш, сохраняется информация о её координатах и процесс прерывается.
Отрисовка: Обработчик события Form1_Paint вызывает два метода:
drawTrace() – для отрисовки найденного маршрута по сохраненным точкам.
drawTrace2() – для отрисовки препятствий и рамки вокруг них (вызывается по условию, если установлен флаг).
Обработка событий: Событие нажатия на кнопку (button1_Click) управляет пошаговым расширением волны. В нем происходит проверка: если финиш не достигнут (флаг S.off равен 0), вызывается метод расширения волны. Если финиш найден (S.off равен 1), происходит восстановление пути, его отрисовка, очистка поля, установка новой стартовой точки и перезапуск алгоритма.
Вспомогательные методы: Методы IsInside и IsCellFree проверяют, находится ли ячейка внутри границ поля и доступна ли она для прохождения (то есть пустая или является финишной).
Таким образом, структура кода состоит из:
Глобального статического класса для хранения параметров и переменных, общих для всего приложения.
Определения классов для представления ячейки поля и узла пути.
Реализации базового алгоритма поиска пути (обход волнами) и его визуализации.
Реализации более сложного алгоритма поиска пути с минимальными поворотами, который позволяет оптимизировать маршрут по числу изменений направления.
Логики инициализации поля, установки препятствий, отрисовки маршрутов и обработки пользовательских событий (нажатие кнопок, рисование формы).
В сумме, этот код демонстрирует подход к поиску пути на двумерном поле с препятствиями, используя классические методы обхода в ширину, а также расширенный вариант с учетом поворотов, что полезно для оптимизации маршрутов в задачах навигации или планирования движения.
