Доступність місцевості


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 або нульовим, що вам зручніше.
  • Усі вхідні дані будуть складатися з натуральних чисел (за винятком випадків, коли для представлення недосяжних комірок використовується null або 0)

1
@LuisfelipeDejesusMunoz "Вони використовуватимуть верхньо-ліві координати з нульовим
кодом

Ви кажете, що введення / виведення може бути в будь-якому зручному форматі. Чи включає це, наприклад, список / масив із розмірами? Я вважаю, що це зазвичай дозволено, але це, безумовно, економить багато байтів при розборі рядка.
dfeuer

@dfeuer, так, звичайно
Beefster

Я завантажив розширені війни на свій емулятор телефону ... Мені так сумно, що це змушує вас зробити 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

Спробуйте його в он- лайн версії


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'швидкістю a, mщо перевищує 100;, швидкістю , що має ширину 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

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), тоді стартовий і кінцевий координати, а потім швидкість.

Спробуйте в Інтернеті! (Немало сенсу намагатися у більшості тестових випадків!)

Як?

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.