Suponha que tenhamos uma matriz como esta:
11111
12221
12321
12221
11111
Essa matriz representa um terreno e cada célula representa uma parte do terreno. O número em cada célula representa o tempo que a parte do terreno precisa ser completamente queimada (em minutos, se for necessária uma unidade de medida), de acordo com a sua combustibilidade . Se um incêndio começa em qualquer posição (célula), essa célula precisa ser completamente queimada antes que o fogo se propague para as células adjacentes (somente horizontal e vertical, não diagonal). Portanto, se um incêndio é iniciado na posição central, ele precisa:
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
Explicação:
- O fogo começa em [2,2] (baseado em 0), que possui um tempo de gravação de 3.
- Após 3 minutos, [1,2], [2,1], [2,3], [3,2] começam a queimar.
- Após 2 minutos, essas células terminam a queima e o fogo se propaga para todas as células adjacentes, mas [0,2], [2,0], [2,4], [0,4] precisam de apenas mais 1 minuto para queimar, portanto
- Após 1 minuto, essas células são queimadas e a célula se propaga para as células adjacentes.
- Após mais 1 minuto, o restante das células da etapa 3 termina a queima e o fogo se propaga para as células adjacentes (que já estão queimadas, para que nada aconteça).
- Após 1 último minuto, o fogo acaba queimando todo o terreno.
Portanto, a solução para esse caso é de 8 minutos. Se o fogo começar na célula superior esquerda [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
Então agora o tempo total é de 10 minutos.
O desafio
Dada uma matriz NxM (N> 0, M> 0) de valores inteiros que representam o tempo que cada célula precisa ser completamente consumida, escreva o programa / função mais curto que leva essa matriz e um par de números inteiros com a posição em que o incêndio começa , e retorna / imprime o tempo necessário para que o fogo consuma completamente todo o terreno.
- Cada célula terá um tempo de gravação positivo (diferente de zero). Você não pode assumir um valor máximo para as células.
- A matriz não precisa ser quadrada nem simétrica.
- A matriz pode ser indexada em 0 ou 1, como desejar.
- A posição pode ser dada como um único parâmetro com uma tupla de números inteiros, dois parâmetros separados de qualquer outro formato razoável.
- As dimensões da matriz não podem ser especificadas como parâmetros de entrada.
- Você não precisa produzir cada etapa intermediária, apenas a quantidade de tempo solicitada. Mas não vou reclamar se as etapas forem visualizadas de alguma forma.
Outro exemplo:
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 é o código-golfe , por isso o programa mais curto para cada idioma pode ganhar!
1
aM*N