PRÁCTICA DE PROMET - JUEGO DE PRUEBAS PÚBLICO Esquema del documento: 0. Observaciones previas. 1. Composición de los juegos de pruebas. 2. Entrada y salida de las operaciones. 3. Juego de pruebas público. -------------------------------------------------- 0. OBSERVACIONES PREVIAS -------------------------------------------------- * El número de salas iniciales será como máximo N = 20. De todas formas, el programa debería funcionar (con juegos de pruebas convenientemente adaptados) si N fuera cualquier otro valor mayor que cero. * Los juegos de pruebas estarán formados sólo por números enteros, y todos los valores serán consistentes con los convenios del enunciado de la práctica y de este documento. * Las salidas correspondientes a cada operación irán en líneas distintas. Cuidado con los espacios: si se escribe 1 1 se intepretará como "uno uno"; si se escribe 11, se interpretará como "once". ------------------------------------------------------------------------------- 1. COMPOSICIÓN DE LOS JUEGOS DE PRUEBAS ------------------------------------------------------------------------------- En primer lugar, el programa deberá leer la estructura del sótano. Esta se proporciona en forma de árbol binario recorrido en preorden. Cada nodo representa una sala y contiene un entero: si la sala es inicial, se tratará del identificador de la misma (un valor entre 1 y N); si no, contendrá la distancia de los túneles que entran en ella (cualquier entero estrictamente mayor que 0). El árbol vacío se marcará con un cero (no hay confusión, porque no se permite ni la sala inicial 0 ni la distancia 0). Así pues, la secuencia 1 2 3 0 0 4 0 0 5 0 0 representa al sótano 1 / \ 2 5 / \ 3 4 Las salas iniciales son las hojas del árbol (3, 4 y 5) y la salida es la raíz superior (1). El programa leerá a continuación una guarnición. Ésta contará de a lo sumo N soldados (mosqueteros o guardias). Primero se indica el número exacto que se va a leer, por ejemplo 4. A continuación, los datos de cada soldado aparecerán en una línea nueva y consistirán en tres valores: sala, tipo y calidad. El tipo será 1 en el caso de los mosqueteros y 2 para los guardias. Ejemplo: 4 ----> se van a leer 4 soldados 3 1 2 ----> un mosquetero de calidad 2 para la sala 3 8 2 4 ----> un guardia de calidad 4 para la sala 8 15 2 3 ----> un guardia de calidad 3 para la sala 15 7 1 1 ----> un mosquetero de calidad 1 para la sala 7 Una vez leídos el laberinto y los dispositivos se inicia la lectura y ejecución de las diversas operaciones. ------------------------------------------------------------------------------- 2. ENTRADA Y SALIDA DE LAS OPERACIONES ------------------------------------------------------------------------------- Cada operación se representa mediante un código númerico, que será un entero negativo menor del -10 (esto se ha elegido simplemente para favorecer la legibilidad de los juegos de pruebas). Cada operación comenzará con su código y a éste le seguirán los datos de la misma, si es que necesita alguno. A continuación detallamos las diferentes operaciones. Para ver ejemplos de la sintaxis de sus entradas y salidas ir al apartado 3. * PERSECUCIÓN: Identificación: -10 Datos: no tiene. Salida: Conjunto de guardias y/o mosqueteros que salen del laberinto en cada oleada, ordenados por distancia. Efectos secundarios: no tiene. * MODIFICAR GUARNICIÓN: Identificación: -11 Datos: Dos guarniciones, cada una de ellas con la misma sintaxis que la inicial. Salida: 1 si las guarniciones son compatibles, 0 si no lo son. Efectos secundarios: si las guarniciones son compatibles, la nueva guarnición del programa es la resultante de operar con las dos tal como se piede en el enunciado; si no, la guarnición se queda con su valor antiguo. * INTRODUCIR UN NUEVO LABERINTO: Identificación: -12 Datos: Conjunto de números enteros que representan al nuevo laberinto. Salida: Ninguna. Efectos secundarios: el laberinto pasa a ser el se que acaba se leer. * SALIR DEL PROGRAMA: Identificación: -15 ------------------------------------------------------ 3. JUEGO DE PRUEBAS PÚBLICO ------------------------------------------------------ Entrada comentada: ------------------ 1 1 4 0 0 5 0 0 1 1 8 0 0 9 0 0 7 0 0 #el sótano inicial 4 #el num total de mosqueteros y guardias de la guarnición inicial 4 2 1 # guardia de calidad 1 para la sala 4 5 2 2 # guardia de calidad 2 para la sala 5 9 1 4 # mosquetero de calidad 4 para la sala 9 7 1 2 # mosquetero de calidad 2 para la sala 7 -10 #persecución -11 #cambio de guarnición 2 # total soldados de la 1ª guarnición 4 1 2 # mosquetero de calidad 2 para la sala 4 9 2 2 # guardia de calidad 2 para la sala 9 2 # total soldados de la 2ª guarnición 4 1 2 # mosquetero de calidad 2 para la sala 4 9 2 4 # guardia de calidad 4 para la sala 9 -10 #persecución -11 #cambio de guarnición 3 #idem 4 1 2 9 2 2 5 1 1 2 4 1 2 9 2 4 -11 3 4 1 2 7 2 2 5 1 1 3 4 1 2 9 2 4 8 1 5 -12 #leer nuevo sótano 1 2 4 0 0 5 0 0 3 6 8 0 0 9 0 0 7 10 0 0 11 0 0 #estructura del sótano -10 #persecución -11 #nueva guarnición ... 5 4 1 2 5 2 1 9 1 3 10 2 4 11 2 1 5 10 1 2 4 2 1 11 2 1 5 2 1 9 2 3 -10 #persecución -15 #salir Salida comentada: ----------------- # primera salida 2 2 # cantidad y tipo de los soldados de la primera oleada: 2 guardias 1 1 # cantidad y tipo de los soldados de la segunda oleada: 1 mosquetero 1 # guarniciones compatibles (se actualiza la guarnición) 1 1 # salida con la nueva guarnición, primera oleada 1 mosquetero 1 2 # segunda oleada 1 guardia 0 # guarniciones incompatibles 0 # guarniciones incompatibles 1 1 # salida del nuevo sótano, primera oleada 1 mosquetero 1 2 # segunda oleada 1 guardia 1 # guarniciones compatibles 1 1 # salida con la nueva guarnición, primera oleada 1 mosquetero 1 1 # segunda oleada 1 mosquetero 2 2 # tercera oleada 2 guardias Entrada sin comentar: cortadla y pegadla en un fichero para usarla como entrada a vuestro programa mediante la redirección <. ------------------------------------------------------------------------------- 1 1 4 0 0 5 0 0 1 1 8 0 0 9 0 0 7 0 0 4 4 2 1 5 2 2 9 1 4 7 1 2 -10 -11 2 4 1 2 9 2 2 2 4 1 2 9 2 4 -10 -11 3 4 1 2 9 2 2 5 1 1 2 4 1 2 9 2 4 -11 3 4 1 2 7 2 2 5 1 1 3 4 1 2 9 2 4 8 1 5 -12 1 2 4 0 0 5 0 0 3 6 8 0 0 9 0 0 7 10 0 0 11 0 0 -10 -11 5 4 1 2 5 2 1 9 1 3 10 2 4 11 2 1 5 10 1 2 4 2 1 11 2 1 5 2 1 9 2 3 -10 -15 ------------------------------------------------------------------------------- Salida sin comentar: vuestro resultado ha de coincidir exactamente con éste (probándolo con el comando unix/linux diff -b), con la posiblidad adicional de poner dos o más saltos de línea donde aquí hay uno. ------------------------------------------------------------------------------ 2 2 1 1 1 1 1 1 2 0 0 1 1 1 2 1 1 1 1 1 2 2 ------------------------------------------------------------------------------