You are on page 1of 4

Universidad Diego Portales Curso: Estructuras de Datos

Facultad de Ingenierı́a Profesor: Nelson Baloian
Escuela de Infromática Ayudante: Jaime Guzmán

Tarea 2

Fecha de Entrega: A determinar.
La tarea es individual, para efecto se sancionará por copia dos trabajos ”parecidos”.

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:

1. En vez de retornar false retorno null.
2. En vez de retornar true retorno un string de la forma ”(i,j)”, donde i y j son las coordenadas
del punto donde estoy.
3. Si alguna de las llamadas retorna no null, entonces retorno el mismo string que recibı́ pero
anteponiendo el substring ”(i,j)-¿”

ˆ 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:

1. En vez de retornar false (o null) retorno -1.
2. Si estoy en la salida devuelvo 0
3. Hago las 4 llamadas recursivas, si todas retornan -1 entonces también retorno -1, si no, retorno
el menor número (distinto de -1) incrementado en 1.

2 Ejecución del programa
El programa debe leer la configuración del laberinto de un archivo de texto llamado ”laberinto.txt” en
cuya primera lnea vienen dos números enteros que representan el ancho y alto del laberinto. Luego vienen
lı́neas conteniendo los caracteres del laberinto.

2.1 Ejemplo
9 8
*********
* * *
* ***
* * *
*** *** *
* * *
* ***
*********

El programa debe interactivamente preguntar :

Coordenadas i j ? 6 7 (6 7 ingresado por el usuario)
(No)Existe salida
Un posible camino es : La salida mas prxima esta a X pasos (las
respuestas que da depende de cuantas variantes hayan programado)
Coordenadas i j ?

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++

4 Opciones del Programa
ˆ El programa debe compilar

ˆ El programa debera tener un archivo README, explicando su ejecucion y funcionamiento

ˆ El Programa debera correr mediante linea de comando

ˆ El Codigo Fuente del programa debera estar documentando y bien identado.

5 Restricciones
Su Tarea deberá cumplir con los siguientes requerimientos

ˆ Debe usar C, C++ ó Java para realizar

ˆ 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

ˆ En el inicio del codigo fuente a nivel de comentario debera colocar:

– Nombre y apellido
– RUT
– Email

6 Recomendaciones
ˆ Diseñe su solucion antes de programar

ˆ Realice pruebas de su codigo a medida que va programando

ˆ Pruebe su entrega antes de enviar su trabajo

3
7 Evaluación
Su trabajo se evaluará bajo el siguiente criterio:

ˆ 20% Cumplimiento de las normas de entrega.

ˆ 30% Construcción de la Solución
Compilación
Informe de Depuración (Debera incluirlo dentro del archivo README)
ˆ 50% Prueba de ejecución. Funcionamiento de cada una de las opciones solicitadas. La salida de su
programa, y los archivos que genere, deben seguir las normas indicadas.

8 Entrega
Como parte de su evaluación, usted debe enviar un archivo (.tar.gz, .zip, ó .rar) que contenga lo
siguiente.

ˆ Codigos fuentes (NO cuentan los binarios )

ˆ Archivo README

ˆ Sin Archivos de prueba, el cor

La forma de entrega via mail ó blogs se establecerá en ayudantia o cátedras.

4