地形到達可能性


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>は、右に1マス、次に下に3マス移動することにより、最低7つの移動ポイントが必要です。したがって、移動速度として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、100万)、または0またはnullのいずれか、最も都合の良い方で表されます。
  • すべての入力は正の整数で構成されます(到達不能セルを表すためにnullまたは0を使用しない限り)

1
@LuisfelipeDejesusMunoz「これらは左上原点のゼロインデックス(行、列)座標を使用します」
-Beefster

I / Oは任意の便利な形式にすることができます。それには、たとえば、次元を持つリスト/配列が含まれますか?通常は許可されていると思いますが、文字列を解析するよりも多くのバイトを節約できます。
dfeuer

@dfeuer、もちろんはい
Beefster

電話エミュレータに高度な戦争をダウンロードしました... 13のチュートリアルレベルを実行することを強制するほど悲しいです...非常にひどくリプレイしたかったのですが、古いシステムでチュートリアルをパンダリングするのは我慢強くありません。
魔法のタコUr

回答:


2

TSQLクエリ、205 191バイト

入力はテーブル変数です@t

@ x = start xpos、@ y = start ypos @ i = end xpos、@ j = end ypos @ = speed

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

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を超え、速度amwと高さを持ち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などのアクセス不可)を受け入れ、開始座標と終了座標、そして速度を受け入れます。

オンラインでお試しください!(ほとんどのテストケースを試すのはあまり意味がありません!)

どうやって?

「開始と終了を除くすべての地形の位置」の各パワーセットのすべての順列のリストを作成し、これらを開始と終了で囲み、距離1の直交移動のみを行うものにフィルターをかけ、開始をドロップします。それぞれから、地形にインデックスを戻し、それぞれを合計し、最小値を取り、1を減算し、これが速度よりも小さいことをテストします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.