지형 접근성


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.