Скачиваний:
0
Добавлен:
26.10.2025
Размер:
16.55 Кб
Скачать

Этот код – это Windows Forms-приложение на C#, которое создает поле (сетка) с препятствиями и реализует алгоритмы поиска пути между двумя точками. Основная идея – найти маршрут от случайно установленной стартовой точки (S) до финишной точки (F). При этом реализовано два подхода:

  1. Классический обход волнами (BFS) – базовая реализация, где из стартовой точки «волной» распространяется поиск до нахождения финиша. Каждая ячейка, в которую распространяется волна, получает отметку (цифру, меняющуюся от 1 до 3), а найденный путь восстанавливается по обратным переходам.

  2. Поиск пути с минимальным числом поворотов – более продвинутая версия, где при поиске учитывается не только достижимость ячейки, но и направление движения. Для этого введены:

    • Перечисление 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 проверяют, находится ли ячейка внутри границ поля и доступна ли она для прохождения (то есть пустая или является финишной).

Таким образом, структура кода состоит из:

  • Глобального статического класса для хранения параметров и переменных, общих для всего приложения.

  • Определения классов для представления ячейки поля и узла пути.

  • Реализации базового алгоритма поиска пути (обход волнами) и его визуализации.

  • Реализации более сложного алгоритма поиска пути с минимальными поворотами, который позволяет оптимизировать маршрут по числу изменений направления.

  • Логики инициализации поля, установки препятствий, отрисовки маршрутов и обработки пользовательских событий (нажатие кнопок, рисование формы).

В сумме, этот код демонстрирует подход к поиску пути на двумерном поле с препятствиями, используя классические методы обхода в ширину, а также расширенный вариант с учетом поворотов, что полезно для оптимизации маршрутов в задачах навигации или планирования движения.

Соседние файлы в предмете Автоматизация проектирования систем и средств управления