Тестовое задание ЦРТ

Для запуска требуется ввести ключи в формате ./demo --board board.txt --way rrlluudd -x 0 -y 0, где:

  • --board - имя файла, в котором находятся координаты секций
  • --way - маршрут
  • -x, -y - начальные координаты

Описание задачи:

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

  • Лабиринт представляется в виде набора секций на двумерной плоскости. ** Положение секции определяется двумя целочисленными координатами, например секция (0, 2). ** Если две секции расположены рядом по горизонтали или вертикали (не по диагонали), то между ними есть проход. ** Например: *** набор секций с координатами (0, 0), (0, 1), (1, 0), (1, 1) задает квадратный лабиринт 2x2. *** набор секций с координатами (-1, 0), (0, 0), (1, 0), (0, 1), (0, -1) задает лабиринт из 5 секций в виде креста с центром в секции (0, 0). ** Лабиринт может иметь произвольную форму, состоять из нескольких не связанных между собой частей и т. д.

  • Маршрут в лабиринте задается последовательностью шагов. ** Шагать можно только по 4 направлениям: вверх, вниз, вправо и влево. ** Если в направлении шага есть переход в соседнюю секцию, то текущее положение меняется на нее. ** Если в направлении шага перехода в соседнюю секцию нет, то шаг не имеет эффекта и текущее положение не меняется. ** Например, для лабиринта из двух секций (0, 0) и (1, 0), стартовой точки (0, 0) и маршрута "вправо, вправо, вправо", только первый шаг будет иметь эффект (0, 0) -> (1, 0). Второй и третий шаг оставят текущее положение без изменений, поскольку секции (2, 0) не существует, и конечная точка маршрута останется (1, 0).

  • Требуется определить положение после последнего шага маршрута.

Технические требования:

  • Оформите решение в виде отдельной библиотеки, реализующей основной функционал, и консольного демо-приложения, использующего основную библиотеку.

  • Приложение должно управляться ключами командной строки. ** Карта лабиринта подается на вход приложению в виде пути к текстовому файлу, содержащему список секций, входящих в лабиринт. Секции записываются в формате (x, y), отделяются друг от друга запятой. ** Например (-1, 0), (0, 0), (1, 0), (0, 1), (0, -1) ** Маршрут подается на вход приложения в виде строки из символов "u","d","l","r", где каждый символ означает 1 шаг вверх("u"), вниз("d"), влево("l") и вправо("r") соответственно. ** Стартовая точка передается в виде пары координат x и y. ** Возможный пример запуска: navigator --board board.txt --route "rruu" -x 0 -y 0, но вы можете предложить свой вариант. ** В консоль должен напечататься ответ в том или ином виде.

  • Детали интерфейса библиотеки остаются на ваше усмотрение. ** Следует учесть, что основной юзкейс библиотеки (не приложения, а именно интерфейса библиотеки) состоит в однократной загрузке карты и последующих многократных поисках по ней разных маршрутов.