БлогNot. Алгоритм Ли или конь в лабиринте

Алгоритм Ли или конь в лабиринте

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

По сути, если ходить не на соседнюю клетку, а ходом коня или ещё каким, надо просто изменить принцип выбора соседних элементов при поиске свободных клеток.

Но я сегодня эту задачу уже не доделаю, некогда, а вот не-помню-откуда-взявшийся проект на C++ (консоль Visual Studio 2015), реализующий алгоритм Ли для поиска пути по лабиринту, прикреплю. Соседство клеток там стандартное для игр - вверх, направо, вниз и налево.

Этот проект я и попытался быстро применить к решению задачи.

Вот такой была исходная картинка:

тестовый лабиринт
тестовый лабиринт

Этот "лабиринт коня", если включить в данные информацию о непроходимости линий пересечения двух клеток (некоторые, как видно на картинке, не проходимы) и узлов пересечения четырёх клеток (которые все непроходимы), превратит шахматную доску в массив 15 на 15 такого вида:

int R[rows][cols] = {
  { y, n, e, y, y, y, y, n, y, y, y, y, y, y, y }, //8
  { y, n, n, n, n, n, y, n, y, n, n, n, n, n, y },
  { y, n, y, y, y, n, y, n, y, y, y, n, y, y, y }, //7
  { y, n, y, n, y, n, y, n, n, n, y, n, y, n, n },
  { y, y, y, n, y, y, y, n, y, y, y, n, y, y, y }, //6
  { n, n, n, n, y, n, n, n, y, n, n, n, n, n, y },
  { y, y, y, y, y, n, y, y, y, n, y, y, y, y, y }, //5
  { y, n, n, n, n, n, y, n, n, n, y, n, y, n, n },
  { y, n, y, y, y, y, y, n, y, y, y, n, y, y, y }, //4
  { y, n, y, n, n, n, n, n, y, n, n, n, n, n, y },
  { y, y, y, y, y, n, y, y, y, n, y, y, y, y, y }, //3
  { y, n, n, n, y, n, y, n, n, n, y, n, n, n, n },
  { y, n, y, y, y, n, y, y, y, n, y, n, y, y, y }, //2
  { y, n, y, n, n, n, n, n, n, n, y, n, n, n, y },
  { y, y, s, n, y, y, y, y, y, y, y, y, y, y, y }  //1
  //A     B     C     D     E     F     G     Н
};
// y - проходимо, n - нет, s - начало, e - конец

Класс Pathfinder из приложенного проекта делает всё примерно так, как написано в Вики, для теста использовался показанный выше "конский" лабиринт, при преобразовании данных в формат программы он превратился в такой вот файл data.txt:

Horizontal: 15
Vertical: 15
013000010000000
011111010111110
010001010001000
010101011101011
000100010001000
111101110111110
000001000100000
011111011101011
010000010001000
010111110111110
000001000100000
011101011101111
010001000101000
010111111101110
002100000000000

При описании лабиринта применяются такие числа:

  • 0 - пусто;
  • 1 - препятствие;
  • 2 - начало;
  • 3 - конец.

По идее, решение нашего лабиринта - это путь b1 - a3 - b5 - c7 - a6 - c5 - d7 - b8, но так как мы ходили "по одной клетке", программа выдала вот что:

вывод приложения
вывод приложения

 Скачать архив .zip с решением LeePathFinder для Visual Studio 2015 (5 Кб)

Не забудьте перед сборкой выбрать нужную конфигурацию Studio (x64 или x86).

15.04.2018, 16:20 [3006 просмотров]


теги: шахматы c++ алгоритм форматы studio поиск

К этой статье пока нет комментариев, Ваш будет первым