Desafio Tomado com permissão do meu Concurso de Desafio de Código da Universidade
A dependência que temos dos telefones celulares nos faz carregá-los todas as noites até o nível máximo da bateria, para não correr o risco de ficar sem energia até a metade do dia seguinte. Existem até pessoas que, quando veem uma saída gratuita durante o dia, cobram pelo que pode acontecer.
Eu sou um deles.
Ao longo dos anos, aprimorei minha técnica para não carregar a bateria ao máximo todas as noites. Com minhas rotinas repetitivas perfeitamente conhecidas, sou claro a que horas do dia poderei fazer essas recargas parciais (e quantas unidades o nível aumentará) e o que reduz o nível da bateria entre cada carga. Com esses dados, todas as noites calculo o nível mínimo de bateria necessário para sair de casa no dia seguinte, para que nunca caia abaixo do meu limite auto-imposto de duas unidades.
O que ainda não consegui dominar é o mesmo cálculo quando deixo a rotina estabelecida e tenho várias alternativas para fazer as coisas. Isso acontece, por exemplo, nos dias em que estou a caminho de outra cidade para a qual posso chegar de maneiras diferentes.
Na minha primeira abordagem ao problema, estou assumindo que quero me deslocar em um "tabuleiro de xadrez", do canto superior esquerdo para o canto inferior direito. Em cada "célula", posso cobrar do celular uma quantia específica ou não, e seu nível de carga diminui.
Desafio
Dada uma matriz FxC de números inteiros, produza a quantidade mínima de nível de bateria necessária para ir do canto superior esquerdo para o canto inferior direito sem que o nível de carga caia abaixo de 2 unidades.
Na matriz, um número positivo indica o quanto eu posso carregar o meu celular antes de continuar seguindo o meu caminho, enquanto um número negativo indica que não há tomadas e que a bateria do celular reduz seu nível de carga nessa quantia. É garantido que as quantidades nas células de origem e destino (canto superior esquerdo e inferior direito) sejam sempre 0 e que o restante dos valores (valor absoluto) não exceda 100.
Exemplo
:
O caminho que preciso de menos bateria é:
E a quantidade mínima de bateria que preciso é de 4
Notas
- O início sempre será o canto superior esquerdo
- O fim sempre será o canto inferior direito
- Você não pode ir para uma célula pela qual você já passou. Exemplo: Uma vez na posição (0,1), você não pode ir para o ponto inicial (0,0)
- O nível da bateria não pode (por qualquer motivo) ficar abaixo de 2
- Você pode assumir que sempre haverá um começo e um fim
- Você pode considerar as matrizes unidimensionais como multidimensionais, se precisar
[1,2,3] == [[1,2,3]]
- Pode haver vários caminhos corretos (carga mínima necessária)
- Seu objetivo é produzir apenas o menor nível inicial de bateria necessário, não a rota
- Você só pode ir na vertical e na horizontal (não na diagonal)
Casos de teste
[0, 0] => 2
[0, 1, 0] => 2
[0, -1, 0] => 3
[0, 15, -20, 5, 0] => 7
[[0, -3],[-5, 0]] => 5
[[0, -5, -9, 5], [-3, 5, 2, -2], [2, -4, -4, 0]] => 5
[[0, -1, 1, -1], [-1, -1, -1, -1], [-1, 1, -1, -1], [1, 1, -1, 0]] => 4
[[0,1,-1],[-9,-9,1],[-9,1,-1],[-9,-1,-9],[-9,1,0]]
0s
colocadas uma no canto superior esquerdo e o outro na parte inferior direita