Está en la página 1de 4

Laberinto Problema La administracin del laberinto ha decidido empezar una nueva temporada con un papel tapiz nuevo.

Para esto, necesitan un programa que calcule cuantos cuadros tiene el laberinto. Es un trabajo justo para ti! El laberinto est representado por una matriz de nn (3 n 33, ya que 3 es un dgito mgico!). Algunas celdas de la matriz tienen un caracter de punto (.) que denota a un cuadro vaco. Otras celdas contienen un caracter de numeral (#) que denota un cuadro en el cual hay un monolito de piedra. Todos los cuadros son de tamao 33 metros. Se construyeron paredes alrededor del laberinto (excepto por las esquinas superior izquierda e inferior derecha, las cuales son usadas como entradas y alrededor de las celdas con caracter de numeral. No se construyeron otras paredes. Siempre habr un caracter de punto en las celdas superior izquierda e inferior derecha de la matriz de entrada.

Tu trabajo es calcular la cantidad de cuadros visibles en las paredes dentro del laberinto. En otras palabras, la cantidad de superficie visible para un visitante dentro del laberinto. Debes tener en cuenta que no hay hoyos por lo cuales ver, y no te puedes mover entre dos bloques de piedra adyacentes. Dos bloques se consideran adyacentes si se tocan en cualquiera de sus esquinas. Tomando por ejemplo la imagen: las paredes visibles dentro del laberinto son las que tienen las lneas marcadas en negro. La altura de todas las paredes es de tres metros. Entrada La primera lnea de la entrada contiene un entero n. Las siguientes n lneas contienen n caracteres cada una. Cada lnea describe una fila de la matriz del laberinto. En cada lnea solo habr caracteres de punto y numeral, y ser finalizada con un caracter de fin de lnea. No hay espacios en la entrada. Salida

Tu programa deber escribir en la salida un solo entero: la cantidad exacta de cuadros de papel tapiz que se necesitan.

En las primeras cuatro lneas declaramos las variables a utilizar. Las variables i y j las utilizamos para los ciclos, n para el tamao del laberinto, t para contar el total de paredes, l para guardar el laberinto y b para saber si ya visitamos un cuarto. Para no tener que revisar los casos especiales de las orillas, agregamos un contorno extra a los arreglos (comnmente llamados centinelas). En el procedimiento recorre (lneas 6 a la 21), visitamos el laberinto. Empezamos poniendo el cuarto actual como recorrido (lnea 8). En las siguientes tres lneas revisamos si el cuarto a la derecha lo hemos visitado, y si no lo hemos hecho, revisamos si es un cuarto vaco o una pared. En el caso de que sea un cuarto, lo visitamos. En el caso de que sea una pared, la contamos. En las siguientes nueve lneas realizamos lo mismo que en las tres anteriores, pero para los cuartos de la izquierda, arriba y abajo. La parte principal del cdigo la encontramos entre las lneas 23 y 38. En la lnea 24 leemos el tamao del laberinto. Las siguientes dos lneas las utilizamos para inicializar los arreglos. En laberinto lo inicializamos como si fueran todas paredes (lnea 25), y los cuartos los marcamos como visitables (lnea 26). Entre las lneas 27 y 32 leemos el laberinto. Despus inicializamos el total a cero (lnea 33), y recorremos el laberinto a partir de la entrada (lnea 34). Si no hemos visitado la salida, recorremos esta parte del laberinto (lneas 35 y 36). Por ltimo, escribimos la salida (lnea 37). Al total le restamos cuatro porque la entrada y la salida no tienen dos paredes cada uno, y lo multiplicamos por el rea de cada pared.

Maestro de los Calabozos Problema Ests atrapado en un calabozo tridimensional y necesitas encontrar la forma ms rpida de salir! El calabozo est forma por cubos que pueden o no estar ocupados por rocas. Toma un minuto moverse una unidad al norte, sur, este, oeste, arriba o abajo. No te puedes mover en diagonal y el calabozo est rodeado por piedra slida. Es posible escapar? En caso de que lo sea, cul es el tiempo mnimo para

hacerlo? Entrada La entrada consiste en varios calabozos. La descripcin de cada calabozo empieza con una lnea que contiene a los enteros l, r y c (todos tienen un tamao mximo de 30). l es la cantidad de niveles en el calabozo. r y c son la cantidad de filas y columnas que consta cada nivel del calabozo. En seguida habr l bloques de r lneas conteniendo cada una c caracteres. Cada caracter representa a una celda del calabozo. Una celda ocupado por una piedra est indicada por un caracter # y una libre por el caracter .. Tu posicin inicial est indicado por S y la salida por E. Hay una lnea en blanco despus de cada nivel. La entrada termina con tres cero para l, r y c. Salida Por cada calabozo debes generar una lnea a la salida. Si es posible alcanzar la salida, imprime una lnea con el mensaje: Escaped in x minute(s). donde x debe ser reemplazado por el tiempo ms corto que toma escapar. Si no es posible escapar, imprime la lnea: Trapped!

En las primeras cuatro lneas definimos la estructura posicion, la cual guarda las coordenadas (x, y, z) de la casilla y el tiempo t en el que llegamos. Las variables que vamos a utilizar estn declaradas entre las lneas 6 y 11. El laberinto lo guardamos en la variable maze y en la variable vis guardamos si ya visitamos ese cuarto. El arreglo buffer es la cola que nos indica cual es la siguiente casilla a visitar. En pos_ini guardamos la posicin inicial (las coordenadas de la casilla con la S). Los enteros i, j, y k los utilizamos para los ciclos, y l, r y c para guardar el tamao del laberinto, segn lo descrito en el problema. Entre las lneas 13 y 23 tenemos el procedimiento agrega, el cual aade una nueva posicin a considerar en la cola. Como parmetros tenemos n que es la

posicin del ltimo elemento en la cola, nuevo que es el cuarto desde el que llegamos y dx, dy y dz que son el movimiento con el que llegamos. La bsqueda en amplitud la realizamos en el procedimiento busca (lneas 25 a 51). El parmetro pos nos indica en que posicin estamos, y como la declaramos con var, el valor de la variable que pasamos como parmetro tambin cambia. Las variables pa ypf nos indican la posicin actual y la final en nuestra cola. Empezamos inicializando las posiciones (lnea 28) y agregando a la cola la primera casilla (lnea 29). Hasta que encontremos la salida (lneas 47 y 48), o hasta que no queden ms casillas a visitar (lnea 50), nos movemos a la siguiente posicin en la cola (lneas 31 y 32), revisamos las posiciones adyacentes y si las podemos visitar, las agregamos a la cola (lneas 35 a 46). La parte principal del cdigo la tenemos entre las lneas 53 y 85. Empezamos leyendo las dimensiones del laberinto (lnea 54). Mientras sean distintas de cero (lnea 55), procesamos la entrada. Para saber si los tres son distintos de cero, hacemos la operacinor entre los tres, que es parecido a sumar los tres valores pero ligeramente ms rpido; y tambin es ligeramente ms rpido y corto que comparar cada valor individualmente. Empezamos inicializando las casillas como no visitadas y como pared (lneas 57 y 58). Entre las lneas 59 y 77, leemos el laberinto y guardamos la posicin desde donde iniciamos (lneas 66 a 72). Proseguimos buscando la salida (lnea 78), y en caso de encontrarla escribimos en cuanto tiempo salimos (lneas 81 y 82); en caso de que no, escribimos que estamos atrapados (lnea 80). Terminamos leyendo los tamaos del nuevo caso (lnea 83).

También podría gustarte