Вы находитесь на странице: 1из 2

UNA SOLUCIÓN EJERCICIO PRÁCTICA

Dada una matriz NxM, que representa un laberinto, encontrar un conjunto de movimientos a realizar para encontrar la salida en la posición (N-1,M-1),
desde la posición (0,0). Asuma que el laberinto puede tener posiciones libres (por donde se puede caminar) o bloqueadas (paredes).

Procedure Backtracking(paso) Type Integer Direccion; // 0=Ninguna, 1=Norte, 2=Sur, 3=Este, 4=Oeste;
InicializarAlternativa(alternativa); Const Integer Libre=0;
Repeat Const Integer Pared=1;
ObtenerSiguienteAlternativa(alternativa); Const Integer Visitado=2;
If (AlternativaValida(alternativa)) Then // variables globales
IncluirAlternativa(alternativa, solucionParcial); Array IncI[0..4] of Integer = {0,-1,+1,0,0};
If EsSolucion(solucionParcial) then Array IncJ[0..4] of Integer = {0,0,0,+1,-1};
encontreSolucion = true; Array solucion[0..*] of Integer; // graba las direcciones
ProcesarSolucion(solucionParcial);
Else Integer tamaño_solucion;
nuevoPaso = GenerarNuevoPaso(paso); Boolean encontro;
Backtracking(nuevoPaso); // cada celda puede tener los valores Libre, pared, visitado
If not encontreSolucion Then Array A[0..N-1][0..M-1] of Integer;
Paso = DeshacerPaso(nuevoPaso);
ExcluirAlternativa(alternativa, Procedure Main()
solucionParcial); LeerMatriz(A,N,M);
EndIf tamaño_solucion = 0;
EndIf encontro = false;
EndIf A[0,0] = Visitado;
Until SeAcabaronLasAternativas(alternativa) or Laberinto(0,0);
encontreSolucion==true; EndProcedure

Procedure Laberinto(Integer pasoI, Integer pasoJ)


// tenemos 4 alternativas (Norte, Sur, Este, Oeste)
Integer Alternativa;

// inicializar alternativa con la dirección “ninguna”


Alternativa = 0;
Repeat
// obtener siguiente alternativa
Alternativa = Alternativa+1;

// chequear si la alternativa es válida


If (pasoI+IncI[Alternativa]>=0 and pasoI+IncI[Alternativa]<N and
pasoJ+IncJ[Alternativa]>=0 and pasoJ+IncJ[Alternativa]<N and
A[pasoI+IncI[Alternativa]][ pasoJ+IncJ[Alternativa]] == Libre) then
// incluir alternativa
tamaño_solucion = tamaño_solucion+1;
solucion[tamaño_solucion] = Alternativa;
// chequeando si es solución
If (pasoI == N-1 and pasoJ == M-1) then
// encontramos una solución
encontro = true;
// se imprime la solución
ProcesarSolucion(solucion, tamaño_solucion);
Else
// GenerarNuevoPaso
pasoI = pasoI+ IncI[Alternativa];
pasoJ = pasoJ+ IncJ[Alternativa];
A[pasoI][pasoJ] = Visitado;
// backtracking (nuevo_paso)
Laberinto(pasoI, pasoJ);
If (not encontro) then
// DeshacerPaso
A[pasoI][pasoJ] = Libre;
pasoI = pasoI – IncI[Alternativa];
pasoJ = pasoJ – IncJ[Alternativa];
// ExcluirAlternativa
tamano_solucion = tamano_solucion-1;
EndIf
EndIf
EndIf
Until encontro==true or Alternativa==4;
EndProcedure
Tarea:
Utilizando los esquemas, adapte el algoritmo de laberinto para
1. Encontrar la solución óptima (la que tenga menos movimientos)
2. Imprimir todas las soluciones

Вам также может понравиться