Supongamos que tenemos una matriz como esta:
11111
12221
12321
12221
11111
Esta matriz representa un terreno, y cada celda representa una parte del terreno. El número en cada celda representa el tiempo que la porción de terreno necesita quemarse por completo (en minutos, si se necesita una unidad de medida), de acuerdo con su combustibilidad . Si un incendio comienza en cualquier posición (celda), esa celda debe quemarse por completo antes de que el fuego se propague a las celdas adyacentes (solo horizontal y vertical, no diagonal). Entonces, si se inicia un incendio en la posición central, el incendio necesita:
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
Explicación:
- El fuego comienza en [2,2] (basado en 0), que tiene un tiempo de combustión de 3.
- Después de 3 minutos, [1,2], [2,1], [2,3], [3,2] comienzan a arder.
- Después de 2 minutos, esas celdas terminan quemándose y el fuego se propaga a todas las celdas adyacentes, pero [0,2], [2,0], [2,4], [0,4] necesitan solo 1 minuto más para quemar, así que
- Después de 1 minuto, esas células se queman y la célula se propaga a sus células adyacentes.
- Después de 1 minuto más, el resto de las celdas del paso 3 terminan quemándose y el fuego se propaga a sus celdas adyacentes (que ya están quemadas, por lo que no sucede nada).
- Después de 1 último minuto, el fuego termina quemando todo el terreno.
Entonces la solución a ese caso es de 8 minutos. Si el fuego comienza en la celda superior izquierda [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
Entonces ahora el tiempo total es de 10 minutos.
El reto
Dada una matriz NxM (N> 0, M> 0) de valores enteros que representan el tiempo que cada celda necesita ser completamente consumida, escriba el programa / función más corto que tome esa matriz y un par de enteros con la posición en la que comienza el fuego , y devuelve / imprime el tiempo necesario para que el fuego consuma por completo todo el terreno.
- Cada celda tendrá un tiempo de grabación positivo (no cero). No puede asumir un valor máximo para las celdas.
- La matriz no necesita ser cuadrada ni simétrica.
- La matriz puede ser indexada 0 o indexada 1, como desee.
- La posición se puede dar como un parámetro único con una tupla de enteros, dos parámetros separados de cualquier otro formato razonable.
- Las dimensiones de la matriz no se pueden especificar como parámetros de entrada.
- No necesita generar cada paso intermedio, solo la cantidad de tiempo solicitada. Pero no me quejaré si los pasos se visualizan de alguna manera.
Otro ejemplo:
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
Este es el código de golf , por lo que puede ganar el programa más corto para cada idioma
1
aM*N