Este es un ejercicio en línea para el que estoy tratando de entender la solución.
La pregunta es:
Dada la imagen a continuación (una matriz multidimensional), los valores 0 actúan como una tubería y los valores 1 actúan como cemento. Necesito escribir código para determinar si la "tubería" se extiende desde la parte superior de la primera matriz (se puede decir que es una "apertura" de una tubería) hasta la parte inferior de la última matriz.
const arr = [ [0, 0, 0, 0, 1], [0, 0, 1, 0, 0], [0, 0, 0, 1, 0], [1, 1, 1, 1, 0], [1, 0, 1, 1, 0], ]El código que escriba para la matriz anterior arrojaría "verdadero" porque los valores 0 forman el siguiente patrón (reemplace con el asterisco):
const arr = [ [0, 0, 0, *, 1], [0, 0, 1, *, *], [0, 0, 0, 1, *], [1, 1, 1, 1, *], [1, 0, 1, 1, *], ]
En mi cabeza, visualizo este problema como uno en el que crearía un puntero para moverme por las matrices. Si las reglas solo requirieran que el codificador trabajara con un solo 0 por matriz, el problema sería fácil de resolver. Siendo que hay múltiples callejones sin salida es donde mi mente se vuelve papilla. Supongo que hay una manera más fácil de ver este problema que pensar en bucles. Sé que esto se puede matemetizar, pero no soy exactamente una persona matemática.
Mi proceso de recuperación es simplemente crear una colección de funciones como:
checkSurroundingValues() goForward() goBackward() goLeft() goDOwn() goUp()etc., pero hacerlo de esta manera se convierte en un lío demasiado complicado. Me imagino que hay algunos trucos para visualizar cómo completar este problema. Quiero entender claramente "el truco" y el proceso de pensamiento.
Siento que el camino a seguir es escribir un código que siga a cada "cero" y genere efectivamente un nuevo "rastreador" para seguir cada rastro, pero no tengo idea de cómo escribir eso. :)
hacerlo de esta manera se convierte en un lío demasiado complicado
Es más repetitivo de lo que necesitas, pero no tanto.
Primero haga un conjunto o matriz de índices visitados hasta el momento, por ejemplo, 1_2 corresponde a haber visitado arr[1][2] . Haz una función recursiva que:
Comprueba si la posición que se está iterando ya ha sido visitada. Si es así, vuelve
Comprueba si la posición que se está iterando tiene un 1 o un 0. Si es 1, regresa.
Comprueba si la posición que se está iterando tiene el índice x máximo (en cuyo caso, se encuentra en la parte inferior); volver verdadero
Llame a la función recursivamente con los cuatro cuadrados circundantes: (0, 1), (1, 0), (0, -1), (-1, 0). Si alguna de las llamadas recursivas devuelve verdadero, devuelve verdadero. Debería ser tan simple como
return [ recuse(x + 1, y), recuse(x - 1, y), recuse(x, y + 1), recuse(x, y - 1), ].some(Boolean);Para comenzar la recursividad, llame a la función para todos los elementos superiores en el índice 0 en la matriz de entrada.
Hay una serie de cosas que tienes que hacer para armarlo, pero es un algoritmo bastante simple.