Angenommen, wir haben eine Matrix wie diese:
11111
12221
12321
12221
11111
Diese Matrix repräsentiert ein Gelände und jede Zelle repräsentiert einen Teil des Geländes. Die Zahl in jeder Zelle gibt die Zeit an, die der Teil des Geländes entsprechend seiner Brennbarkeit vollständig verbrannt werden muss (in Minuten, wenn eine Maßeinheit benötigt wird) . Beginnt ein Feuer an einer bestimmten Position (Zelle), muss diese Zelle vollständig verbrannt werden, bevor sich das Feuer auf die benachbarten Zellen ausbreitet (nur horizontal und vertikal, nicht diagonal). Wenn also ein Feuer in der Mittelposition ausgelöst wird, benötigt das Feuer:
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
Erläuterung:
- Feuer beginnt bei [2,2] (0-basiert), was eine Brenndauer von 3 hat.
- Nach 3 Minuten beginnen [1,2], [2,1], [2,3], [3,2] zu brennen.
- Nach 2 Minuten brennen diese Zellen nicht mehr und das Feuer breitet sich auf alle benachbarten Zellen aus, aber [0,2], [2,0], [2,4], [0,4] brauchen nur noch 1 Minute, um zu brennen
- Nach 1 Minute werden diese Zellen verbrannt und die Zelle breitet sich zu ihren benachbarten Zellen aus.
- Nach einer weiteren Minute brennen die restlichen Zellen aus Schritt 3 und das Feuer breitet sich auf die benachbarten Zellen aus (die bereits verbrannt sind, sodass nichts passiert).
- Nach einer letzten Minute brennt das Feuer auf dem gesamten Gelände.
Die Lösung für diesen Fall sind also 8 Minuten. Wenn das Feuer in der Zelle ganz oben links beginnt [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
Die Gesamtzeit beträgt jetzt also 10 Minuten.
Die Herausforderung
Schreiben Sie bei einer NxM-Matrix (N> 0, M> 0) von ganzzahligen Werten, die die Zeit darstellen, die jede Zelle benötigt, um vollständig verbraucht zu werden, das kürzeste Programm / die kürzeste Funktion, die diese Matrix benötigt, und ein Paar ganzer Zahlen mit der Position, an der das Feuer beginnt , und gibt die Zeit aus, die das Feuer benötigt, um das gesamte Gelände vollständig zu verbrauchen.
- Jede Zelle hat eine positive Brenndauer (ungleich Null). Sie können keinen Maximalwert für die Zellen annehmen.
- Die Matrix muss weder quadratisch noch symmetrisch sein.
- Die Matrix kann 0-indiziert oder 1-indiziert sein, wie Sie möchten.
- Die Position kann als ein einzelner Parameter mit einem Tupel von ganzen Zahlen angegeben werden, zwei getrennte Parameter in jedem anderen vernünftigen Format.
- Die Abmessungen der Matrix können nicht als Eingabeparameter angegeben werden.
- Sie müssen nicht jeden Zwischenschritt ausgeben, sondern nur die angeforderte Zeit. Aber ich werde mich nicht beschweren, wenn die Schritte in irgendeiner Weise visualisiert werden.
Ein anderes Beispiel:
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
Das ist Code-Golf , also kann das kürzeste Programm für jede Sprache gewinnen!
1
bisM*N