Universidad de Costa Rica. Escuela de Computación. CI-0113 Programación II
2018a. Grupo 05. **Examen 01** [19-May-2018]. Profesor [Jeisson Hidalgo-Céspedes](mailto:jeisson.hidalgo@ucr.ac.cr).
--- # El plato en el piso suspendido Suponga que usted ingresa como científico(a) de la computación a una empresa de entretenimiento. Su equipo asignado está trabajando en un videojuego de aventura arqueológica, al estilo de Indiana Jones. El videojuego consta de varias pantallas con acertijos. Actualmente el equipo está trabajando en un amplio salón rectangular cuyo rústico piso es bastante particular. Entre lo que permite ver la gruesa capa de polvo que lo cubre, el suelo tiene un aspecto cuadriculado. Algunos mosaicos se ven más oscuros y blandos. Si el carácter del jugador pisa uno de ellos, el mosaico se quebrará y el carácter caerá a un abismo y el jugador perderá el juego. El carácter del jugador porta el diario escrito por su padre, quien fue también un famoso arqueólogo. En la página 519 tradujo de un grabado cananeo un proverbio clave: > Quien transita sin cuidado por el piso del abismo, perecerá en él. El prudente, quien aleja sus pasos del peligro, vivirá. Pero el sabio, quien se refugia en el lugar más distante del peligro, hallará lo que busca. El jugador que descifra el acertijo, buscará el mosaico claro que se encuentre más alejado de mosaicos oscuros, se dirigirá a él sin pisar un mosaico oscuro, y utilizará un cincel que obtuvo en un aposento anterior para romper el mosaico. Si el jugador escoge el mosaico correcto, encontrará un plato grabado con el León de Judá de mucho valor arqueológico, el cual tiene una leyenda requerida en un nivel posterior. Si escoge el mosaico incorrecto, caerá al abismo al debilitar el mosaico con el cincel. Por la mecánica del juego, el jugador está limitado a moverse sólo un mosaico a la vez, y en un paso puede moverse a cualquiera de los ocho mosaicos vecinos. Al ser un videojuego, el jugador puede reintentar el acertijo. El equipo de desarrollo quiere evitar que el jugador adivine el mosaico correcto por prueba y error. Por tanto, cada vez que el jugador ingresa en el salón, se quiere aleatorizar los mosaicos oscuros, y en consecuencia el mosaico objetivo. El equipo necesita una subrutina en C la cual reciba un piso rectangular e indique el mosaico donde el videojuego deba esconder el plato grabado. Para asegurarse de que la subrutina haga su trabajo correctamente, el equipo preparó algunos casos de prueba. Usted debe, además de la subrutina, escribir un programa que la pruebe contra los casos preparados. El equipo quiere que los casos consten en la entrada de las dimensiones del piso en filas y columnas, seguidas por una representación visual del piso rectangular, donde un guión (`-`) indica un mosaico claro y firme, y un numeral (`#`) indica un mosaico oscuro y blando. **Ejemplo de entrada**: 5 15 -----#-------#- -#-------#----- ---#--------#-- ---#----------- #---------##--- **Ejemplo de salida**: 3 -----#-------#- -#-------#----- ---#--------#-- ---#--O-------- #-----OO--##--- Para el equipo sería conveniente que la subrutina reciba el piso como una matriz y en ella marque con una "o" mayúscula (`O`) la celda firme donde debe esconderse el plato grabado. Esta celda es la que se encuentre a mayor distancia de las celdas oscuras. Sin embargo, puede ocurrir que dos o más celdas se encuentren a la mayor distancia de las celdas oscuras. En tal caso la subrutina debe marcar todas ellas en la matriz. Para facilitar el trabajo al equipo, la subrutina debe retornar un valor entero indicando la cantidad de celdas donde se debe esconder el plato. Este número permite rápidamente al equipo determinar si el piso es adecuado o no para el juego. Si en el piso no hay celdas oscuras, la subrutina debe retornar `-1`, y si no hay celdas blancas debe retornar cero `0`. Estos valores se escogieron para indicar al equipo de que el piso no es factible para el juego. En ambos casos no se debe modificar la matriz. El programa de pruebas debe invocar la subrutina e imprimir en la salida el número de platos que la subrutina retornó y el piso resultante con los platos marcados. Dado que se puede querer probar pisos muy grandes, se debe evitar que el programa de pruebas termine su ejecución por un desbordamiento. Si un piso está incompleto o tiene caracteres no esperados, el programa debe imprimir `invalid data` para alertar al equipo con el fin de que corrijan el caso de prueba. ## Evaluación 1. [20%] Diseña una solución (algoritmo) usando los ocho tipo de instrucciones vistos en clase. Delega responsabilidad en al menos diez subtareas. 3. [20%] Implementa el algoritmo como un programa de pruebas correcto compuesto de al menos diez subrutinas. 2. [30%] Implementa la subrutina solicitada correctamente. 4. [20%] Aplica buenas prácticas de programación. Por ejemplo: identificadores significativos, indentación, no utiliza variables globales, paréntesis balanceados. 5. [10%] Evita que el programa se caiga por desbordamientos de pila, accesos inválidos (ej: no acceder a memoria con un puntero nulo), no provoca fugas de memoria. 6. [10% extra] Transcribe su algoritmo y su código fuente a HackerRank, y lo corrige para pasar los casos de prueba.