次のような行列があると仮定します。
11111
12221
12321
12221
11111
このマトリックスは地形を表し、各セルは地形の一部を表します。各セルの数値は、その可燃性に応じて、地形の一部を完全に燃やす必要がある時間(測定単位が必要な場合は分単位)を表します。特定の位置(セル)で火災が発生した場合、そのセルは、隣接するセル(対角線ではなく、水平および垂直のみ)に伝播する前に完全に燃焼する必要があります。そのため、中央の位置で火災が発生した場合、火災には次のことが必要です。
11111 11111 11111 11011 10001 00000
12221 3 m. 12221 2 m. 12021 1 m. 11011 1 m. 00000 1 m. 00000
12321 -----> 12021 -----> 10001 -----> 00000 -----> 00000 -----> 00000
12221 12221 12021 11011 00000 00000
11111 11111 11111 11011 10001 00000
説明:
- 火災は[2,2](0から始まる)から始まり、燃焼時間は3です。
- 3分後、[1,2]、[2,1]、[2,3]、[3,2]が燃え始めます。
- 2分後、これらのセルは燃え尽き、火は隣接するすべてのセルに伝播しますが、[0,2]、[2,0]、[2,4]、[0,4]はあと1分で燃えます。
- 1分後、それらの細胞は燃やされ、細胞は隣接する細胞に伝播します。
- さらに1分後、ステップ3の残りのセルの燃焼が終了し、隣接するセルに火が伝播します(すでに燃焼しているため、何も起こりません)。
- 最後の1分後、火は地形全体を燃やします。
したがって、その場合の解決策は8分です。火が左上のセル[0,0]で始まる場合:
11111 01111 00111 00011 00001 00000
12221 1 12221 1 02221 1 01221 1 00121 1 00011 1
12321 --> 12321 --> 12321 --> 02321 --> 01321 --> 00321 -->
12221 12221 12221 12221 02221 01221
11111 11111 11111 11111 11111 01111
00000 00000 00000 00000 00000
00000 1 00000 1 00000 1 00000 1 00000
00221 --> 00110 --> 00000 --> 00000 --> 00000
00221 00121 00020 00010 00000
00111 00011 00001 00000 00000
したがって、合計時間は10分になりました。
チャレンジ
すべてのセルを完全に消費する必要がある時間を表す整数値のNxMマトリックス(N> 0、M> 0)が与えられた場合、そのマトリックスと、発火の開始位置を持つ整数のペアを受け取る最短のプログラム/関数を記述します、火災が地形全体を完全に消費するのに必要な時間を返します。
- すべてのセルには、正の(ゼロ以外の)書き込み時間があります。セルの最大値を想定することはできません。
- 行列は正方である必要も対称である必要もありません。
- マトリックスには、必要に応じて0インデックスまたは1インデックスを付けることができます。
- 位置は、整数のタプルを持つ単一のパラメーター、その他の妥当な形式の2つの別個のパラメーターとして指定できます。
- マトリックスの次元を入力パラメーターとして指定することはできません。
- すべての中間ステップを出力する必要はなく、求められた時間だけを出力する必要があります。しかし、手順が何らかの形で視覚化されていても文句は言いません。
もう一つの例:
Fire starts at [1,1] (a '>' represents a minute):
4253 4253 4253 4153 4043 3033 2023 0001 0000
2213 > 2113 > 2013 > 1003 > 0002 > 0001 > 0000 >> 0000 > 0000
1211 1211 1211 1111 1001 0000 0000 0000 0000
Output: 9
これはcode-golfなので、各言語の最短プログラムが勝つかもしれません!
1
までM*N