Supponiamo di avere una matrice come questa:
11111
12221
12321
12221
11111
Questa matrice rappresenta un terreno e ogni cella rappresenta una porzione di terreno. Il numero in ogni cella rappresenta il tempo in cui la porzione di terreno deve essere completamente bruciata (in minuti, se è necessaria un'unità di misura), in base alla sua combustibilità . Se un incendio inizia in una determinata posizione (cella), quella cella deve essere completamente bruciata prima che il fuoco si propaghi alle celle adiacenti (solo orizzontale e verticale, non diagonale). Quindi, se un incendio viene avviato nella posizione centrale, il fuoco ha bisogno di:
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
Spiegazione:
- Il fuoco inizia da [2,2] (basato su 0), che ha un tempo di combustione di 3.
- Dopo 3 minuti, [1,2], [2,1], [2,3], [3,2] iniziano a bruciare.
- Dopo 2 minuti, quelle celle terminano la combustione e il fuoco si propaga a tutte le celle adiacenti, ma [0,2], [2,0], [2,4], [0,4] richiedono solo 1 minuto in più per bruciare, quindi
- Dopo 1 minuto, queste cellule vengono bruciate e la cellula si propaga alle cellule adiacenti.
- Dopo 1 minuto in più, il resto delle celle del passaggio 3 termina la combustione e il fuoco si propaga alle loro celle adiacenti (che sono già bruciate, quindi non succede nulla).
- Dopo 1 ultimo minuto, il fuoco finisce bruciando l'intero terreno.
Quindi la soluzione a quel caso è di 8 minuti. Se l'incendio inizia nella cella in alto a sinistra [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
Quindi ora il tempo totale è di 10 minuti.
La sfida
Data una matrice NxM (N> 0, M> 0) di valori interi che rappresentano il tempo in cui ogni cella deve essere completamente consumata, scrivere il programma / funzione più breve che prende quella matrice e una coppia di numeri interi con la posizione in cui inizia l'incendio e restituisce / stampa il tempo necessario affinché il fuoco consumi completamente l'intero terreno.
- Ogni cella avrà un tempo di combustione positivo (diverso da zero). Non puoi assumere un valore massimo per le celle.
- La matrice non deve essere quadrata né simmetrica.
- La matrice può essere 0-indicizzata o 1-indicizzata, come preferisci.
- La posizione può essere data come un singolo parametro con una tupla di numeri interi, due parametri separati di qualunque altro formato ragionevole.
- Le dimensioni della matrice non possono essere specificate come parametri di input.
- Non è necessario eseguire l'output di ogni passaggio intermedio, ma solo il tempo richiesto. Ma non mi lamenterò se i passaggi sono visualizzati in alcun modo.
Un altro esempio:
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
Questo è code-golf , quindi può vincere il programma più breve per ogni lingua!
1
aM*N