Załóżmy, że mamy taką macierz:
11111
12221
12321
12221
11111
Ta matryca reprezentuje teren, a każda komórka reprezentuje część terenu. Liczba w każdej komórce reprezentuje czas, w którym część terenu musi zostać całkowicie spalona (w minutach, jeśli potrzebna jest jednostka miary), zgodnie z jej palnością . Jeśli ogień rozpocznie się w dowolnej pozycji (komórce), komórka ta musi zostać całkowicie spalona, zanim ogień rozprzestrzeni się na sąsiednie komórki (tylko poziomo i pionowo, a nie po przekątnej). Tak więc, jeśli pożar zostanie rozpoczęty w pozycji środkowej, ogień potrzebuje:
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
Wyjaśnienie:
- Ogień rozpoczyna się w [2,2] (w oparciu o 0), który ma czas spalania 3.
- Po 3 minutach [1,2], [2,1], [2,3], [3,2] zaczynają się palić.
- Po 2 minutach komórki te kończą palenie, a ogień rozprzestrzenia się na wszystkie sąsiednie komórki, ale [0,2], [2,0], [2,4], [0,4] potrzebują tylko 1 minuty, aby spalić, więc
- Po 1 minucie komórki te są spalane, a komórka propaguje się do sąsiednich komórek.
- Po 1 minucie pozostałe komórki z etapu 3 kończą palenie, a ogień rozprzestrzenia się na sąsiednie komórki (które są już spalone, więc nic się nie dzieje).
- Po 1 ostatniej minucie ogień kończy się, paląc cały teren.
Rozwiązaniem tej sprawy jest 8 minut. Jeśli pożar rozpocznie się w górnej lewej komórce [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
Zatem teraz całkowity czas wynosi 10 minut.
Wyzwanie
Biorąc pod uwagę macierz NxM (N> 0, M> 0) wartości całkowitych, które reprezentują czas, w którym każda komórka musi zostać całkowicie zużyta, napisz najkrótszy program / funkcję, która przyjmuje tę macierz i parę liczb całkowitych z pozycją, w której rozpoczyna się ogień , i zwraca / drukuje czas potrzebny do całkowitego pożaru całego terenu.
- Każda komórka będzie miała dodatni (niezerowy) czas spalania. Nie można przyjąć maksymalnej wartości dla komórek.
- Matryca nie musi być kwadratowa ani symetryczna.
- Macierz może być dowolnie indeksowana lub indeksowana 1.
- Pozycja może być podana jako pojedynczy parametr z krotką liczb całkowitych, dwoma oddzielnymi parametrami o dowolnym innym rozsądnym formacie.
- Wymiary matrycy nie mogą być określone jako parametry wejściowe.
- Nie musisz generować każdego pośredniego kroku, wystarczy ilość zadanego czasu. Ale nie będę narzekać, jeśli kroki zostaną w jakikolwiek sposób zwizualizowane.
Inny przykład:
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
To jest golf golfowy , więc może wygrać najkrótszy program dla każdego języka!
1
doM*N