Доступность местности

12

Пошаговые тактические игры, такие как Advance Wars, Wargroove и Fire Emblem, состоят из квадратной сетки с изменяющимся ландшафтом с единицами разных классов движения, требующих разных затрат для каждого типа местности. Мы будем исследовать часть этой проблемы.

Вызов

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

Юниты могут двигаться только ортогонально, если стоимость перемещения на квадрат равна значению соответствующей ячейки на сетке (перемещение бесплатно). Например, перемещение из ячейки с ценностью 3 в ячейку с ценностью 1 стоит 1 движение, но для перехода в другой путь требуется 3. Некоторые квадраты могут быть недоступны.

пример

1 [1] 1  1  1
1  2  2  3  1
2  3  3  3  4
1  3 <1> 3  4

Перемещение от [1]к <1>требует минимум 7 пунктов движения, перемещаясь вправо на одну клетку, а затем вниз на три. Таким образом, если задано 6 или менее в качестве скорости движения, вы должны вывести ложный ответ.

Примеры тестовых случаев

Они будут использовать нулевые индексы (строка, столбец) с верхним левым началом, а не заключенные в квадратные скобки ячейки для начала и конца, чтобы упростить анализ. Недоступные ячейки будут представленыX

Дело 1а

1 1 2 1 X
1 2 2 1 1
2 1 1 2 1
X X X 1 2
Speed: 5
From (2, 3) to (0, 1)

Output: True

Дело 1б

1 1 2 1 X
1 2 2 1 1
2 1 1 2 1
X X X 1 2
Speed: 4
From (2, 3) to (0, 1)

Output: False

Дело 1с

1 1 2 1 X
1 2 2 1 1
2 1 1 2 1
X X X 1 2
Speed: 5
From (0, 1) to (2, 3)

Output: False

Дело 2а

3 6 1 1 X 4 1 2 1 X
5 1 2 2 1 1 1 X 1 5
2 1 1 1 2 1 1 1 X 1
2 1 1 3 1 2 3 4 1 2
1 1 2 1 1 4 1 1 1 2
3 2 3 5 6 1 1 X 1 4
Speed: 7
From (3, 4) to (2, 1)

Output: True

Дело 2б

3 6 1 1 X 4 1 2 1 X
5 1 2 2 1 1 1 X 1 5
2 1 1 1 2 1 1 1 X 1
2 1 1 3 1 2 3 4 1 2
1 1 2 1 1 4 1 1 1 2
3 2 3 5 6 1 1 X 1 4
Speed: 4
From (3, 4) to (2, 1)

Output: False

Дело 2с

3 6 1 1 X 4 1 2 1 X
5 1 2 2 1 1 1 X 1 5
2 1 1 1 2 1 1 1 X 1
2 1 1 3 1 2 3 4 1 2
1 1 2 1 1 4 1 1 1 2
3 2 3 5 6 1 1 X 1 4
Speed: 7
From (1, 8) to (2, 7)

Output: True

Дело 3а

2 1 1 2
2 3 3 1
Speed: 3
From (0, 0) to (1, 1)

Output: False

Дело 3б

2 1 1 2
2 3 3 1
Speed: 3
From (1, 1) to (0, 0)

Output: True

Правила, предположения и примечания

  • Стандартные лазейки запрещены, ввод / вывод может быть в любом удобном формате
  • Вы можете предположить, что все координаты находятся в сетке
  • Скорость движения никогда не будет больше 100
  • Недоступные ячейки могут быть представлены с очень большими числами (например, 420, 9001, 1 миллион) или с 0 или нулем, в зависимости от того, что наиболее удобно для вас.
  • Все входные данные будут состоять из положительных целых чисел (если только не использовать ноль или 0 для представления недоступных ячеек)
Beefster
источник
1
@LuisfelipeDejesusMunoz «Они будут использовать координаты с нулевым индексом (строка, столбец) верхнего левого начала»
Beefster
Вы говорите, что ввод / вывод может быть в любом удобном формате. Включает ли это, например, список / массив с измерениями? Я считаю, что это обычно разрешено, но это определенно экономит много байтов при разборе строки.
dfeuer
@dfeuer, да, конечно
Бифстер
Я загрузил продвинутые войны на свой эмулятор телефона ... Мне так грустно, что это заставляет вас делать 13 обучающих уровней ... Я очень сильно хотел воспроизвести его, но мое терпение невелико для учебного панорамирования на старых системах.
Волшебная Осьминог Урна

Ответы:

2

TSQL-запрос, 205 191 байт

Ввод является табличной переменной @t

@ x = начало xpos, @ y = начало ypos @ i = конец xpos, @ j = конец ypos @ = скорость

DECLARE @t table(x int,y int,v int)
INSERT @t
values
(0,0,1),(0,1,1),(0,2,2),(0,3,1),(0,4,null),
(1,0,1),(1,1,2),(1,2,2),(1,3,1),(1,4,1),
(2,0,2),(2,1,1),(2,2,1),(2,3,2),(2,4,1),
(3,0,null),(2,1,null),(2,2,null),(2,3,1),(2,4,2)

DECLARE @x INT=2,@y INT=3,@i INT=0,@j INT=1,@ INT=5;

WITH C as(SELECT @y f,@x r,@ s
UNION ALL
SELECT f+a,r+b,s-v FROM C
JOIN(values(1,0),(0,1),(-1,0),(0,-1))x(a,b)ON
s>0JOIN @t
ON f+a=x and r+b=y)SELECT
max(iif(S>=0and f=@j and r=@i,1,0))FROM c

Попробуй онлайн версию без игры в гольф

t-clausen.dk
источник
0

Python 2 , 220 байт

def f(m,a,w,h,r,c,R,C):
 T=[w*[999]for _ in' '*h];T[r][c]=0;P=[(r,c)];j,k=1,0
 for u,v in P:exec"U,V=u+j,v+k;j,k=-k,j\nif h>U>-1<V<w:q=T[U][V];T[U][V]=min(T[u][v]+m[U][V],q);P+=[(U,V)]*(q>T[U][V])\n"*4
 return a>=T[R][C]

Попробуйте онлайн!

Принимает массив mцелых чисел со 'X'значением больше 100; скорость a, mимеющая ширину wи высоту h; и возвращает то, что мы можем начать с нумерованной строки строки / столбца (r,c)и добраться до последней ячейки (R,C).

Алгоритм представляет собой модифицированную заливку. Слегка негольфированный код:

def f(m,a,w,h,r,c,R,C):
 T = [w*[999]for _ in ' '*h] # make an array same size as m, with all 
                             #   values 999, whose values will represent
                             #   the cost of getting to each cell.
 T[r][c] = 0                 # set the starting location to a cost of 0
 P = [(r,c)]                 # initialize a set of cells whose neighbors'
                             #   cost might need to be be updated
 j,k = 1,0                   # and also j,k which will take on values:
                             #  (1,0), (0,1), (-1,0), (0,1), used to 
                             #  probe orthogonal neighbors
 for u,v in P:               # scan the cells in P
    for _ in '1234':         # look at each of 4 orthogonal positions
        U,V = u+j,v+k        # U and V get the indexes of a neighbor 
                             #   of the current cell.
        j,k = -k,j           # this 'rotates' the j,k pairing.
        if h>U>-1<V<w:       # if the coordinates are in bounds...
            q = T[U][V]      # save the current 'cost' of getting to cell (U,V)
                             # see if we can reduce that cost, which is calculated 
                             #   by taking the cost of the currently scanned cell 
                             #   + the value from m for the neighbor cell. 
            T[U][V] = min(T[u][v]+m[U][V] ,q)
                             # if we can reduce the cost, add the neighbor
                             #   to P because **it's** neighbors might,
                             #   in turn, need updating.
            P += [(U,V)]*(q>T[U][V])
 return a>=T[R][C]           # return if speed is enough for the cost.
Час Браун
источник
0

JavaScript (ES7),  116  113 байтов

(matrix)([endRow, endCol])(speed, startRow, startCol)01

m=>e=>o=g=(s,y,x)=>m.map((r,Y)=>r.map((v,X)=>r[s<v|(x-X)**2+(y-Y)**2-1||g(s-v,Y,X,r[X]=1/0),X]=v),o|=y+[,x]==e)|o

Попробуйте онлайн!

комментарии

m =>                        // m[] = matrix
e =>                        // e[] = target coordinates
  o =                       // o   = success flag, initialized to a non-numeric value
  g = (                     // g   = recursive depth-first search function taking:
    s,                      //   s    = speed
    y, x                    //   y, x = starting coordinates
  ) =>                      //
    m.map((r, Y) =>         // for each row r[] at position Y in m[]:
      r.map((v, X) =>       //   for each value v at position X in r[]:
        r[                  //     this statement ultimately updates r[X]:
          s < v |           //       abort if s is less than v
          (x - X) ** 2 +    //       or the quadrance between (x, y)
          (y - Y) ** 2 - 1  //       and (X, Y) is not equal to 1
          || g(             //       otherwise, do a recursive call to g:
               s - v,       //         subtract v from s
               Y, X,        //         pass (Y, X) as the new coordinates
               r[X] = 1 / 0 //         temporarily make this cell unreachable
             ),             //       end of recursive call 
          X                 //       restore r[X] ...
        ] = v               //     ... to its original value
      ),                    //   end of inner map()
      o |= y + [, x] == e   //   set the flag o if (y + ',' + x) matches (e + '')
    ) | o                   // end of outer map(); return o
Arnauld
источник
0

Желе , 59 байт

+2¦µ_2ịæ.ؽœị$Ʋ+5ịƲ$4¦01Ñḣ3Ḋ⁼/Ɗ?ḣ2=/ẸƊoF<0ẸƊƊ?
çⱮØ.,U$;N$¤Ẹ

Попробуйте онлайн!

Не очень быстро; пробует все пути, пока единицы скорости не будут исчерпаны, даже повторяя его шаги. Однако это избавляет от необходимости проверять, посещаются ли места. Ввод предоставляется как[nrows, ncols],[start_row, start_col],[end_row, end_col],speed,flattened matrix column-major

объяснение

Вспомогательная ссылка

+2¦                                       | add the right argument to the second item in the left argument (current location)
   µ                                      | start a new monadic chain with the modified left argument
                    4¦                    | for the fourth item (speed)...
    _                                     |   subtract...
                 ịƲ$                      |     the item located at...
     2ịæ.ؽœị$Ʋ                           |       the dot product of the current position and (number of columns,
                                          |       right-padded with 1)
               +5                         |       plus five
                                        ? | Now, if...
                                       Ɗ  |   next three as a monad
                           ḣ2=/ẸƊ         |   either current row or current column are equal to nrows/ncolumns respectively
                                 o        | or
                                  F<0ẸƊ   |   any value is negative
                 0                        | return zero
                          ?               | else if...
                   ḣ3Ḋ⁼/Ɗ                 | the second and third items (current and end pos) are equal
                  1                       | return 1
                   Ñ                      | else pass the current list back to the main link

Главная ссылка

ç             | call the helper link with the current list...
 Ɱ            |   and each of
  Ø.,U$;N$¤   |   [0,1],[1,0],[0,-1],[-1,0]
           Ẹ  | Check if any are true
Ник Кеннеди
источник
0

Желе , 38 байт

ạƝṢ€Ḅ’¬Ạ
ŒṪ’ḟŒPŒ!€ẎW€j¥@€ÇƇḊ€‘œị⁸§Ṃ’<⁵

Чрезвычайно неэффективная полная программа, принимающая рельеф (с невидимыми значениями, равными 101), затем начало и конец, а затем скорость.

Попробуйте онлайн! (не так много смысла пробовать большинство тестовых случаев!)

Как?

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

Джонатан Аллан
источник