Введение

Добро пожаловать, авантюрист. Ваша цель - пройти лабиринт и добраться до финиша, не касаясь стен. Это убьет вас мгновенно!

Задача

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

Массив лабиринта будет выглядеть так

maze = [[1,1,1,1,1,1,1],
        [1,0,0,0,0,0,3],
        [1,0,1,0,1,0,1],
        [0,0,1,0,0,0,1],
        [1,0,1,0,1,0,1],
        [1,0,0,0,0,0,1],
        [1,2,1,0,1,0,1]]

..со следующим ключом

0 = Safe place to walk
1 = Wall
2 = Start Point
3 = Finish Point
directions = ["N","N","N","N","N","E","E","E","E","E"] == "Finish"

Правила

  1. Массив лабиринта всегда будет квадратным, то есть N x N, но его размер и содержимое будут меняться от теста к тесту.
  2. Позиции старта и финиша изменятся для финальных тестов.
  3. Массив направлений всегда будет в верхнем регистре и будет иметь формат N = север, E = восток, W = запад и S = ​​юг.
  4. Если вы достигли конечной точки до того, как все ваши ходы закончились, вы должны вернуться к Finish.
  5. Если вы наткнетесь на какие-либо стены или выйдете за границу лабиринта, вы должны вернуть Dead.
  6. Если вы все еще находитесь в лабиринте после использования всех ходов, вы должны вернуть Потерянный.

Мой подход (javascript)

Шаг 1. Инициализируйте координаты лабиринта и начальную позицию

Нам дан лабиринт в виде двумерного массива с воспринимаемыми «высотой» и «шириной». Исходя из этого, мы можем изобразить лабиринт в виде сетки с координатами по осям X и Y.

Давайте инициализируем переменные для «координат» сетки, а также график начальной точки. На данный момент установите их равными нулю, чтобы изменить их позже.

Шаг 2. Прокрутите массив лабиринта и задайте координаты оси Y.

Давайте запомним наш массив лабиринта как сетку. На нашей оси Y существует каждый вложенный массив. (Визуально они накладываются друг на друга, что упрощает концептуализацию этой аналогии.) Нам нужно установить координаты и ограничения нашей оси Y в зависимости от количества вложенных массивов в нашем лабиринте. Для этого инициализируйте цикл for.

Внутри этого цикла for мы установим каждый индексированный массив в качестве координат для нашей оси Y.

Шаг 3. Пройдитесь по каждому вложенному массиву и установите координаты для оси X.

Теперь, когда учтена ось Y, нам нужно использовать аналогичный подход для создания координат для нашей оси X. Взгляните на данный массив лабиринта еще раз, и вы увидите, что каждый отдельный вложенный массив содержит целые числа, которые проходят по горизонтали. (Как и раньше, эта визуализация поможет нам еще больше концептуализировать нашу аналогию с сеткой.) Давайте пройдемся по каждому массиву, чтобы установить ограничения нашей оси X в зависимости от длины вложенных массивов. Сделайте это, инициализировав еще один цикл for.

Теперь внутри этого цикла for мы установим каждый индекс в качестве координат для нашей оси X.

Шаг 4. Давайте найдем отправную точку

Теперь, когда мы позволили себе нанести на карту каждую координату по обеим осям, нам нужно найти нашу начальную точку. В инструкциях это представляется как целое число 2. Пока наши циклы for создают наши координаты для наших осей, давайте также убедимся, что они обновляют значения наших начальных точек, startX и startY. Сделайте это, создав оператор if, который проверяет целое число 2.

Шаг 5. Следуйте указаниям на карте

Теперь, когда мы создали нашу «сетку» и нашли координаты начальной точки, нам нужно пройти через лабиринт!

Нам даны направления карты в виде массива. Давайте начнем с цикла по этим направлениям, чтобы мы могли прочитать каждую команду по порядку. Сделайте это, создав (как вы уже догадались…) цикл for.

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

Давайте создадим оператор switch, который принимает каждое направление как случай и перемещается в соответствующем направлении.

Если задано «N», мы хотим переместиться на одну координату вверх по оси Y, если задано «E», мы хотим переместиться вперед на одну координату по оси X, если задано «S», мы хотим переместиться вниз одну координату по оси Y, и, наконец, если задано «W», мы хотим переместить нашу начальную точку на одну координату назад по оси X.

В терминах JavaScript каждый соответствующий случай, в свою очередь, будет добавлять или вычитать 1 из соответствующей переменной, startX или startY.

Шаг 6. Условия! Мы «закончены», «умерли» или «пропали»?

Теперь, когда наша функция может свободно перемещать начальную точку по лабиринту, нам нужно вспомнить правила игры.

«Стены» представлены числом 1 в нашем лабиринте. Мы также можем считать стенами все, что выходит за границы нашего лабиринта. Если наша начальная точка сталкивается со стеной в любой точке, нам нужно return “Dead”. Давайте создадим оператор if, который проверяет ряд условий:

  • Если значение startY всегда меньше 0 или больше высоты нашей оси Y, мы вышли за пределы ограничений нашего лабиринта.
  • Если значение startX всегда меньше 0 или больше длины нашей оси X, мы вышли за пределы ограничений нашего лабиринта.
  • Если направления когда-нибудь придут к 1, мы натолкнемся на стену внутри ограничений нашего лабиринта.

Если в какой-то момент, когда мы прокручиваем наши направления, мы приходим к 3 , мы нашли конечную точку нашего лабиринта. Создайте оператор if, который проверяет это условие и return "Finish", если условие выполнено.

Наконец, если мы прошли все направления, не наткнувшись на стену, но ни разу не достигли конечной точки 3 , мы заблудились в лабиринте. Если оба условия операторов if, которые мы ранее создали, не выполняются, нам нужно return "Lost" .

Решено!

Мы написали нашу функцию mazeRunner(), и это Ката завершено!

Это немного расширенный подход, пожалуйста, не стесняйтесь комментировать ниже с более простыми решениями или уточняющими вопросами! Получайте удовольствие от кодирования :)

Окончательный код: