Reto tomado con permiso de mi concurso de desafío de código universitario
La dependencia que tenemos de los teléfonos móviles nos hace cargarlos todas las noches hasta el nivel máximo de la batería, por lo que no corremos el riesgo de quedarnos sin energía a mediados del día siguiente. Incluso hay personas que, cuando ven un enchufe gratuito durante el día, lo cobran por lo que pueda suceder.
Yo soy uno de ellos.
Con los años, he perfeccionado mi técnica para no cargar la batería al máximo todas las noches. Con mis rutinas repetitivas perfectamente conocidas, tengo claro en qué momentos del día podré hacer esas recargas parciales (y cuántas unidades aumentará el nivel) y qué reduce el nivel de batería entre cada carga. Con estos datos, cada noche calculo el nivel mínimo de batería con el que tengo que salir de la casa al día siguiente para que nunca caiga por debajo de mi umbral autoimpuesto de dos unidades.
Lo que aún no he logrado dominar es ese mismo cálculo cuando dejo la rutina establecida y tengo varias alternativas para hacer las cosas. Ocurre, por ejemplo, en los días en que me dirijo a otra ciudad a la que puedo llegar de diferentes maneras.
En mi primer acercamiento al problema, supongo que quiero moverme alrededor de un "tablero de ajedrez", desde la esquina superior izquierda a la esquina inferior derecha. En cada "celda" puedo cargar el móvil una cantidad específica, o no puedo y su nivel de carga baja.
Desafío
Dada una matriz de enteros FxC, produzca la cantidad mínima de nivel de batería que necesito para ir desde la esquina superior izquierda a la esquina inferior derecha sin que el nivel de carga caiga por debajo de 2 unidades.
En la matriz, un número positivo indica cuánto puedo cargar mi teléfono móvil antes de tener que continuar siguiendo mi camino, mientras que un número negativo indica que no hay salidas y que la batería del móvil baja su nivel de carga en esa cantidad. Se garantiza que las cantidades en las celdas de origen y destino (esquina superior izquierda e inferior derecha) son siempre 0 y que el resto de los valores (valor absoluto) no exceden de 100.
Ejemplo
dado:
El camino que necesito menos batería es:
Y la cantidad mínima de batería que necesito es 4
Notas
- El inicio siempre será la esquina superior izquierda
- El final siempre será la esquina inferior derecha
- No puedes ir a una celda que ya has pasado. Ejemplo: una vez en la posición (0,1), no puede ir al punto inicial (0,0)
- Su nivel de batería no puede (por ningún motivo) ser inferior a 2
- Puedes asumir que siempre habrá un principio y un final
- Puede tomar las matrices unidimensionales como multidimensionales si necesita
[1,2,3] == [[1,2,3]]
- Puede haber múltiples rutas correctas (carga mínima necesaria)
- Su objetivo es producir solo el nivel de batería inicial más bajo necesario, no la ruta
- Solo puedes ir vertical y horizontalmente (no diagonalmente)
Casos de prueba
[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
colocados uno en la esquina superior izquierda y el otro en la esquina inferior derecha