Categorías
Algorithms

Encuentra un camino en una matriz

Dada una matriz 2d, busque un camino desde la esquina superior izquierda hasta la esquina inferior derecha. Suponga que existe al menos una ruta y que solo necesita encontrar una ruta válida. Puede moverse hacia arriba, hacia la derecha, hacia abajo, hacia la izquierda en cualquier posición.

Por ejemplo, dado

[1, 0, 0, 0, 0]
[1, 0, 1, 1, 1]
[1, 1, 1, 0, 1]
[1, 0, 0, 0, 1]
[1, 0, 0, 0, 1]

Una ruta válida es

[1, 0, 0, 0, 0]
[1, 0, 1, 1, 1]
[1, 1, 1, 0, 1]
[0, 0, 0, 0, 1]
[0, 0, 0, 0, 1]

Solución Java

public int[][] findPath(int[][] matrix){
	int m = matrix.length;
 
	int[][] result = new int[m][m];
 
	ArrayList<int[]> temp = new ArrayList<int[]>();
	ArrayList<int[]> list = new ArrayList<int[]>();
 
	dfs(matrix, 0, 0, temp, list);
 
 
	for(int i=0; i<list.size(); i++){
		result[list.get(i)[0]][list.get(i)[1]]=1;
		//System.out.println(Arrays.toString(list.get(i)));
	}
 
	result[0][0]=1;
 
	return result;
}
 
public void dfs(int[][] matrix, int i, int j, 
		ArrayList<int[]> temp,  ArrayList<int[]> list){
 
	int m=matrix.length;
 
	if(i==m-1 && j==m-1){
		list.clear();
		list.addAll(temp);
		return;
	}
 
	int[] dx = {-1, 0, 1, 0};
	int[] dy = {0, 1, 0, -1};
 
	for(int k=0; k<4; k++){
		int x = i+dx[k];
		int y = j+dy[k];
 
		if(x>=0&&y>=0&&x<=m-1&&y<=m-1 && matrix[x][y]==1){
			temp.add(new int[]{x,y});
			int prev = matrix[x][y];
			matrix[x][y]=0;
 
			dfs(matrix, x, y, temp, list);
 
			matrix[x][y]=prev;
			temp.remove(temp.size()-1);
		}
	}		
}

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *