UNIVERSIDAD CENTRAL DE VENEZUELA FACULTAD DE CIENCIAS ESCUELA DE COMPUTACIÓN Técnicas Avanzadas de Programación Tarea #3. Algoritmos de Grafos Fecha de Entrega: Jueves 17 de Diciembre de 2015 Esta tarea consta de dos problemas que deberán ser resueltos por Ud. 1. Parte A Una forma de crear un laberinto aleatorio es modificando un DFS. La idea es inicialmente suponer que se tiene un grafo en donde cada posición del laberinto es un vértice del grafo. Suponiendo inicialmente que no hay paredes en el laberinto, cada vértice tendrá a lo sumo 4 vecinos, como se muestra en la Figura??. Figura 1: Grafo inicial para un laberinto de 4 4 Ahora bien, si se hace un recorrido DFS del grafo, pero usando direcciones aleatorias en lugar de usar siempre el mismo patrón de direcciones, es posible crear un árbol parecido al de la Figura?? Figura 2: Posible recorrido DFS aleatorio 1
Luego, a partir de ese recorrido es posible remover todos los arcos que no generaron una visita a un nodo, para de esta forma obtener el laberinto que se observa en la Figura??. Figura 3: Izquierda: Grafo obtenido. Derecha: Laberinto equivalente Su programa deberá tener como entrada dos enteros N, M que representan las dimensiones del laberinto. La salida debe ser una represetnación gráfica del laberinto usando el formato de Portable Bitmap (pbm) que puede ser leído por programas de edición de imágenes como GIMP o Photoshop. El formato pbm es bastante conveniente ya que en su versión más sencilla maneja imágenes en blanco y negro en formato de texto (no binario). Una forma de generar esta imagen es pensar que cada vértice del grafo está rodeado de máximo 4 paredes, pero si existe un arco entre un par de vértices es necesario remover una de las paredes. El formato de archivos pbm es el siguiente: P1 M N Fila 1... Fila i... Fila N En donde P1 es literalmente el string P1. M y N son el número de columnas y filas de la imagen. Habrán N filas cada una de las cuales tendrá un número 0 o 1. Un ejemplo de un posible archivo pbm es el siguiente (puede copiarlo en un archivo de texto con extensión pbm y abrirlo con GIMP o Photoshop): P1 5 4 1 1 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 2
La Figura?? muestra un ejemplo de un laberinto generado con el método anterior. Es importante resaltar que deben evitarse caminos muy cortos que hacen que el laberinto no sea visualmente agradable, como se muestra en la Figura??. Figura 4: Laberinto de 20 20 Figura 5: Laberinto de 20 20 con caminos muy cortos 2. Parte B Pedro tiene dos robots controlados con control remoto, pero únicamente un control remoto. Suponga que los robots están en un tablero de N N celdas y se 3
desea llevarlos a las posiciones a y b del tablero. El control remoto únicamente permite girar a la izquierda o a la derecha 90, o avanzar un paso hacia adelante, pero como hay un solo control remoto, cada vez que hagas un movimiento ambos robots lo harán. Por ejemplo, en la Figura 1, la imagen de la izquierda muestra la situación inicial. La flecha que apunta a la derecha es un robot de cara al este, y la flecha apuntando hacia arriba es un robot apuntando hacia el norte. Las posiciones a y b son los destinos de los robots. La imagen del centro muestra el resultado luego de mover un paso hacia adelante. La imagen de la derecha muestra el resultado luego de girar los robots a la izquierda. Figura 6: Movimiento de los robots. Las celdas grises son paredes Ahora Pedro desea que lo ayudes a calcular el número mínimo de movimientos necesarios para llevar a los robots desde sus posiciones originales hasta sus destinos finales. Si a un robot se le ordena moverse hacia una pared el no lo hará (recuerde que son robots, no fantasmas). Si les ordena a los dos robots que caminen a la misma posiciíon tampoco lo harán (de nuevo, no son fantasmas). Refiérase a la Figura 2 para más información. En la imagen de la izquierda los robots pueden llegar a sus destinos en tres movimientos, aunque uno de los robots no se mueve en todos esos pasos. La imagen de la derecha muestra una situaciíon en la que los robots no pueden avanzar ya que ocuparían la misma posición. Nótese que pueden haber paredes dentro del tablero. Los robots no pueden moverse dentro de una pared o fuera del tablero. Entrada La entrada debe ser leída por la entrada estándar (stdin). La entrada consiste de varios casos. La primera línea de cada caso comuienza con un entero N que indica el tamaño del tablero (N N), 2 N 50. Las siguientes N líneas describen el tablero, y contienen N caracteres cada una. Un. indica una celda vacía, un N, E, S o O indica la posición original del robot, de cara al Norte, Este, Sur u Oeste respectivametne; una D indica un destino para un robot (cualquiera de los robots), y * indica una pared. La entrada culminará con un caso donde N = 0. Ejemplo: 4
Figura 7: Algunas situaciones especiales 5 D... N...S *...*...D 5 S..S. D..D. 3 SN. ***.DD 0 Salida La salida debe ser escrita por la salida estándar (stdout). Para cada caso de la entrada, imprima una línea con un entero indicando el mínimo número de movimientos necesarios para mover los robots a sus destinos. Imprima 1 si no hay forma de lograr que los robots lleguen a sus destinos. Ejemplo para la entrada anterior: 8 3-1 Esta tarea puede implementarse usando los lenguajes C, C++ o Java. Debe en- 5
tregar el o los archivos fuente. Esta tarea puede hacerse en equipos de 2 personas.la tarea debe ser enviada a tapucv@gmail.com. El asunto del correo debe ser: [TAP-T4-CI1.CI2]. Por ejemplo, si la tarea es entregada por alguien con cédula 66.334.333, el asunto del correo debe ser: [TAP-T4-66334333]. En caso de que sean dos cédulas estas deben separarse por un punto: [TAP-T4-66334333.44345665]. GDTAP 6