Entonces, esta es la pregunta para encontrar el camino más largo de 1 en una matriz de 0 y 1 desde las coordenadas iniciales hasta las coordenadas finales.
Aquí está la solución que descubrí de alguna manera y que también entiendo (casi). Aunque tengo problemas para entender una línea de esto:
function longestPath02(matrix, startPosition, endPosition) { let maxDistance = 0; const visited = {}; function isValidCoordinate(i, j) { // check if the coordinates are in valid range // if (i < 0 || i > matrix.length - 1 || j > matrix[0].length - 1 || j < 0) return false; if (i > matrix.length - 1 || i < 0 || j > matrix[0].length - 1 || j < 0) return false; // check if the coordinate is one AND not visited if ((matrix[i] || [])[j] !== 1 || visited[`${i},${j}`]) return false; return true; } function calculate(startPosition, endPosition, distance) { const [i, j] = startPosition; const [x, y] = endPosition; if (i === x && j === y) { maxDistance = Math.max(distance, maxDistance); return; } visited[`${i},${j}`] = true; if (isValidCoordinate(i + 1, j)) calculate([i + 1, j], endPosition, distance + 1); if (isValidCoordinate(i - 1, j)) calculate([i - 1, j], endPosition, distance + 1); if (isValidCoordinate(i, j + 1)) calculate([i, j + 1], endPosition, distance + 1); if (isValidCoordinate(i, j - 1)) calculate([i, j - 1], endPosition, distance + 1); visited[`${i},${j}`] = false; // 👈 } calculate(startPosition, endPosition, 0); return maxDistance; }¡No puedo entender por qué tenemos que establecer visitado como falso!
Sin eso, el resultado es incorrecto. ¿Cómo es relevante establecer la coordenada visitada como falsa?
Conjunto de datos:
let mat = [ [1, 0, 1, 1, 1, 1, 0, 1, 1, 1], [1, 0, 1, 0, 1, 1, 1, 0, 1, 1], [1, 1, 1, 0, 1, 1, 0, 1, 0, 1], [0, 0, 0, 0, 1, 0, 0, 1, 0, 0], [1, 0, 0, 0, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [1, 0, 0, 0, 1, 0, 0, 1, 0, 1], [1, 0, 1, 1, 1, 1, 0, 0, 1, 1], [1, 1, 0, 0, 1, 0, 0, 0, 0, 1], [1, 0, 1, 1, 1, 1, 0, 1, 0, 0], ]; console.log(longestPath02(mat, [0, 0], [5, 7]));Si entiendo el código correctamente, la línea resaltada está retrocediendo.
Considere esta línea: visited[`${i},${j}`] = true; . El propósito de esta línea es evitar que el DFS recursivo visite un punto que acaba de visitar (de lo contrario, simplemente obtendrá un bucle recursivo).
Pero una vez que haya terminado con esa ruta, debe "restablecer", razón por la cual la configura en falso al final. ¡La razón es que de lo contrario, está impidiendo que futuras llamadas recursivas accedan a ese elemento! En otras palabras, una vez que haya terminado de recorrer un camino, debe liberarlo para que otro camino pueda acceder a ese elemento si es necesario (de lo contrario, ese camino se confundirá y dejará de pensar que ya ha accedido a un elemento cuando no lo ha hecho). t).