Documente Academic
Documente Profesional
Documente Cultură
Tarea 2
1 Problema
Problema: se tiene una matriz de caracteres de dimensiones MxN que representa un laberinto. En los
elementos donde hay un caracter ’*’ significa que hay una pared y no se puede pasar por esa posicin y
por donde hay un espacio ’ ’ se puede pasar. Un ejemplo serı́a:
* * * * * * * * *
* * * *
* * * *
* * * *
* * * * * *
* * *
* * * *
* * * * * * * * *
Se le pide escribir un método public static boolean salida(char[][] x, int i, int j, int M, int N) que
retorne true si a desde la posición i,j se puede encontrar una salida.
Recursivamente esto se puede programar de la siguiente manera, probando todos los caminos posi-
bles:
1. Si en la posicin donde estoy (i,j) hay un ’*’ no hay salida y retorno false.
2. si estoy en una orilla (vertical u horizontal) y hay un entonces estoy fuera y retorno true.
3. Si estoy en posicin (i,j) y hay un espacio, pruebo recursivamente si hay salida por alguna de
las 4 vecinas (i+1,j), (i-1,j), (i,j+1), (i,j-1). Si alguna de las llamadas retorna true, yo retorno
true (suponemos que no se puede mover en diagonal). Si todas las llamadas retornan false,
entonces retorno false.
Esta solución tiene el problema que puede generar llamadas infinitas. Por ejemplo, si llamamos
a salida(x, a, b, M,N) y está vacı́a pero no es salida, esta llamará a salida(x,a+1,b,M,N). Si la
celda (a+1,b) está vacı́a y no es salida, llamará a salida(x, a+1-1,b,M,N), generandose ası́ un ciclo
infinito. Para evitar esto podemos ir ”marcando” (por ejemplo, con una x) los lugares por donde
hemos pasado para no pasar de nuevo por ahı́:
1
Se le pide escribir un método que retorne un string que contenga la secuencia de (i,j) por donde hay
que pasar para llegar a la salida (cualquiera) o null si no hay salida. Para eso debemos modificar
el encabezado:
public static String sailda(char[][] x, int i, int j, int M, int N)
Además modificamos el algoritmo de la siguiente manera:
Finalmente, queremos saber cuánto mide el camino mı́nimo (de existir) entre la celda i,j y la salida
más próxima. Para esto tenemos que probar todas las posibilidades y nos quedamos con la mejor
(más corta). Para ello cambiamos el encabezado:
public static int sailda(char[][] x, int i, int j, int M, int N)
Además modificamos el algoritmo de la siguiente manera:
2.1 Ejemplo
9 8
*********
* * *
* ***
* * *
*** *** *
* * *
* ***
*********
Coordenadas i j? 0 0
Fin
2
3 Consideraciones
1. Si usted desea programar en otro lenguaje que no se java ( C , C++) debera implemtar esta
estructura y ejecucion para que realize la misma funcion.
2. Para manipular el stream de entrada usted podra utilizar cualquier recurso de lenguaje de pro-
gramacion usado para manipularlo con su programa, por ejemplo Scannner(), BufferedReader(),
scanf(), etc.
3. Para poder ejecutar el programa usted no debera realizar ningun tipo de interface grafica el pro-
grama solo debera correr por linea de comando. En su defecto debera compilar y ejecutarse por
consola:
En java , compilar javac
En C , compilar con gcc
En C++, compilar con g++
5 Restricciones
Su Tarea deberá cumplir con los siguientes requerimientos
Los nombres de archivo que se leen y escriben deben indicarse de manera relativa al directorio en
que se ejecuta el programa. Esto significa que no debe obligar a que los archivos se encuentren en
una direccion absoluta como C: M is Documentos M iT area, o /home/Yo/MiTarea.
Codigo fuente DOCUMENTADO
– Nombre y apellido
– RUT
– Email
6 Recomendaciones
Diseñe su solucion antes de programar
3
7 Evaluación
Su trabajo se evaluará bajo el siguiente criterio:
8 Entrega
Como parte de su evaluación, usted debe enviar un archivo (.tar.gz, .zip, ó .rar) que contenga lo
siguiente.
Archivo README