지형 접근성


12

Advance Wars, Wargroove 및 Fire Emblem과 같은 턴제 전술 게임은 각 지형 유형마다 다른 비용이 필요한 다양한 운동 등급의 단위로 다양한 지형의 사각형 격자로 구성됩니다. 우리는 그 문제의 부분 집합을 조사 할 것입니다.

도전

당신의 임무는 그리드 비용과 이동 속도의 그리드가 주어진 한 위치에서 다른 위치에 도달 할 수 있는지 확인하는 것입니다.

단위는 정사각형으로 이동하는 비용이 그리드의 해당 셀 값인 경우에만 직교로 이동할 수 있습니다 (이동은 무료 임). 예를 들어, 셀 3의 셀에서 1의 셀 1로 이동하는 데 1 개의 이동이 필요하지만 다른 방법으로는 3이 필요합니다. 일부 사각형에는 액세스 할 수 없습니다.

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

에서 1 칸 이동 한 다음 3 칸 아래로 이동하여 최소 7 개의 이동 지점 [1]<1>필요합니다. 따라서 이동 속도가 6 이하이면 허위 응답을 출력해야합니다.

테스트 사례 예

이것들은 구문 분석을 쉽게하기 위해 시작 및 종료를 위해 대괄호로 묶인 셀 대신 왼쪽 상단 원점 인덱스 (행, 열) 좌표를 사용합니다. 도달 할 수없는 셀은X

사례 1a

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

사례 1b

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

사례 1c

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

사례 2a

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

사례 2b

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

사례 2c

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

사례 3a

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

Output: False

사례 3b

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

Output: True

규칙, 가정 및 메모

  • 표준 허점은 금지되어 있으며, I / O는 편리한 형식 일 수 있습니다
  • 좌표가 모두 그리드에 있다고 가정 할 수 있습니다
  • 이동 속도는 100을 넘지 않습니다
  • 액세스 할 수없는 셀은 매우 큰 숫자 (예 : 420, 9001, 1 백만) 또는 0 또는 null로 표시 될 수 있습니다.
  • 모든 입력은 양의 정수로 구성됩니다 (도달 할 수없는 셀을 나타 내기 위해 null 또는 0을 사용하지 않는 한)

1
@LuisfelipeDejesusMunoz "이것은 좌-원점 0 인덱스 (행, 열) 좌표를 사용합니다"
Beefster

I / O는 편리한 형식 일 수 있습니다. 예를 들어 차원이있는 목록 / 배열이 포함됩니까? 나는 그것이 일반적으로 허용 된다고 생각 하지만 문자열을 구문 분석하는 것보다 많은 바이트를 확실히 절약합니다.
dfeuer

@dfeuer, 예
Beefster

휴대 전화 에뮬레이터에서 고급 전쟁을 다운로드 했습니다 ... 13 개의 튜토리얼 레벨을 수행해야해서 너무 슬프 습니다. 매우 심하게 재생하고 싶었지만, 인내심은 구식 시스템의 튜토리얼 패딩을 위해 종이가 얇습니다.
Magic Octopus Urn

답변:


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

온라인 ungolfed 버전 사용해보기


0

파이썬 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).

알고리즘은 수정 된 플러드 필입니다. 약간 ungolfed 코드 :

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

자바 스크립트 (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은 방문 할 수 없음)과 시작 및 끝 좌표가 속도를 조정합니다.

온라인으로 사용해보십시오! (대부분의 테스트 사례를 시도하는 것은별로 중요하지 않습니다!)

어떻게?

"시작 및 끝을 제외한 모든 지형 위치"의 각 전력 집합에 대한 모든 순열 목록을 작성하고, 시작 및 끝으로 이들을 각각 둘러싸고, 거리 1의 직교 이동 만하는 것으로 필터링하고 시작을 삭제합니다. 각각에서 지형으로 다시 색인하고 각각을 합산하고 최소값을 빼고 1을 빼고 속도보다 작은 지 테스트합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.