Algoritmos Autor: José Ángel Acosta Rodríguez © 2006 Algoritmos José Ángel Acosta Rodríguez ÍNDICE Página Índice ……………………………………………………………………………………………………1 Problema 1. Movimiento de figuras geométricas ……………………………………………….2 Problema 2. Conversión decimal a binario ……..………………………………………………..3 Problema 3. Secuencias binarias …………………………………………………………………..4 Problema 4. Conversión a binario a octal …………..………………………………………….…6 Problema 5. Sucesión matemática ..……………….…………………………………………….…7 Problema 6. Relleno de mapa de bits I ………………………………………………………….…8 Problema 7. Seguridad de cuentas bancarias ………………………………………………..…10 Problema 8. Relleno de mapa de bits II. Negativo de mapa de bits …………………………12 Problema 9. Ley D’Hont ……………………………………………………………………………..14 Problema 10. Búsqueda en un intervalo……………………………………………………….....16 Problema 11. Space Invaders ……………………………………………………………………...17 Problema 12. Cleaning-Robot . ..…………..……………………………………………………...19 1 Algoritmos José Ángel Acosta Rodríguez Figurita original Problema 1. Se desea hacer un cierto algoritmo para un juego. El algoritmo recibe una matriz A de dimensiones 3x3. La matriz describe una cierta figurita en blanco y negro. Los elementos de la matriz aij contienen unos (color negro) para representar elementos de la figurita y ceros (color blanco) en otro caso. Por ejemplo véase en la figura de la derecha que se representa con unos una sencilla figura, que podría ser el carácter “L”, y el resto de componentes de la matriz son cero. El algoritmo lee desde el teclado los elementos aij de la matriz A y una variable p. Según el valor de p el algoritmo debe hacer lo siguiente: 1 0 0 1 0 0 1 1 0 Rotación a derechas • Si p=1, debe rotar la figura a derechas 90 grados. 1 1 1 • Si p=2, debe hacer un Flip horizontal respecto de la fila central, es decir hacer una imagen especular de las filas superior e inferior. 1 0 0 • Si p>2, el algoritmo continua y escribe la matriz resultante B. 0 0 0 El algoritmo se representa en la figura de abajo a la izquierda, en forma de diagrama de flujo. En dicho diagrama de flujo ya está implementada la parte de lectura desde el teclado de los elementos aij de la matriz A y la variable p. También se tienen inicializados a cero los subíndices i y j. Se pide que se completen los dos diagramas de flujo correspondientes a la rotación y al flip de la figurita representada en la matriz A, de modo que no pueden definirse más subíndices que los ya inicializados i y j. Además la matriz resultante de la rotación o del flip debe almacenarse en los elementos bij de una matriz B, ya inicializada. INICIO MODULO Eje de giro Flip horizontal 0 0 0 1 0 0 1 1 1 INICIO ROTACIÓN A DERECHAS INICIO FLIP HORIZONTAL FIN ROTACIÓN A DERECHAS FIN FLIP HORIZONTAL LEE MATRIZ A y variable p SI ROTACIÓN A DERECHAS NO NO ¿p=1? FLIP HORIZONTAL ¿p>2? SI ESCRIBE MATRIZ B SI FIN MODULO 2 Algoritmos José Ángel Acosta Rodríguez Problema 2. Se desea realizar un algoritmo que lea un número entero (positivo o negativo) y escriba dicho número en binario codificado en modo signo-valor absoluto en N bits. Asuma que el número se puede representar con N bits. La representación en modo signo-valor absoluto consiste en considerar el bit más significativo (el 1º) como bit de signo (0 positivo, 1 negativo) y en los N-1 bits restantes codificar en binario el valor absoluto del número (ver ejemplos). Para solucionar este problema se propone lo siguiente: 1) Realice un diagrama de flujo correspondiente a un módulo que tome un número positivo num y determine un vector b de N componentes que contiene la codificación binaria en base 2 del mismo. Considere que la componente b1 corresponde al bit menos significativo (el último), y la bN al signo. 2) Utilizando el módulo anterior, realice un diagrama de flujo que solucione el problema Por ejemplo: Si se lee el número 100 y se consideran 8 bits, el módulo del apartado 1) genera el vector b=[0,0,1,0,0,1,1,0] y el diagrama completo escribe la secuencia 01100100. Si se lee el número -100 y se consideran 8 bits, el módulo del apartado 1) genera el mismo vector b=[0,0,1,0,0,1,1,0] y el diagrama completo escribe la secuencia 11100100. INICIO DEL MÓDULO INICIO DEL DIAGRAMA PRINCIPAL FIN DEL MÓDULO FIN DEL DIAGRAMA PRINCIPAL 3 Algoritmos José Ángel Acosta Rodríguez Problema 3. Dibujar los diagramas de flujo que resuelven los siguientes problemas y rellenar las tablas de variables de cada uno: a) Suponga leída una secuencia binaria v de N bits, encontrar la primera secuencia de S unos seguidos y escribir por pantalla la posición del primer uno dentro de la secuencia v. Si no se encuentra ninguna secuencia de S unos seguidos, mostrar por pantalla un cero. b) Si la secuencia binaria leída representa un nº en base 2 tal que vN es el bit menos significativo, calcular el número que representa en base 10 y escribirlo en pantalla. Ejemplo: N=11 S =3 1 v1 0 v2 0 v3 1 v4 1 v5 1 v6 1 v7 1 v8 0 v9 0 v10 1 v11 a) Por pantalla: 4 b) Por pantalla: 1273 No utilice más espacio que el indicado. Use acceso a vectores y matrices mediante subíndices. Emplee únicamente expresiones en lenguaje natural, operaciones aritméticas (+, -, ·, /, resto de la división entera), asignación (←) y comparaciones (>, <, =, ≠, ≤, ≥). Se puntuará la claridad y legibilidad de los diagramas. a) v N S Vector de variables enteras Variable entera Variable entera Dato. Secuencia leída de bits. Dato. Número de bits de la secuencia leída. Dato. Número de bits a 1 que localizar en v. b) v N Vector de variables enteras Variable entera Dato. Secuencia leída de bits. Dato. Número de bits de la secuencia leída. 4 Algoritmos José Ángel Acosta Rodríguez Inicio a Inicio b Fin a Fin b 5 Algoritmos José Ángel Acosta Rodríguez Problema 4. Considere una secuencia de N bits almacenados en un vector b de N componentes de forma que bN almacena el bit más significativo de la secuencia. Se pide realizar un algoritmo que obtenga el número en octal (en base 8), lo almacene en el vector d y lo escriba en pantalla. Para pasar de un número en base 2 a base 8, basta con tomar los bits de la secuencia de 3 en 3 e interpretarlos como un número decimal. Véase el siguiente ejemplo, en el que el número binario 01011110 se transforma en el 136 en base 8. Para realizar el algoritmo se pide a) Un módulo que tome un número binario de 3 bits almacenado en un vector v y calcule el dígito decimal b que representa. b) Basándose en el anterior, hacer el diagrama de d flujo que resuelve el problema. b Vector de N enteros M d Entero. Número de componentes de d Vector de M enteros b8 0 1=01 d3 b7 1 ) 2 b6 0 3=011 d2 b5 1 ) 2 b4 1 b3 1 6=110 d1 b2 1 ) b1 0 2 6 Algoritmos José Ángel Acosta Rodríguez Problema 5. Obtenga un algoritmo que resuelva el problema cuyo enunciado es: Calcular el producto de los e primeros elementos de una sucesión cuyo término general cumple: ak = ak-1 + 2·ak-2 + ... + n·ak-n , siendo a1=1 , a2=2, ..., an=n El algoritmo ha de leer únicamente el valor de e y de n. Suponga que ambos son enteros y positivos. El algoritmo ha de escribir como único resultado el producto: e p = ∏ ah h=1 Se pide: dibujar el diagrama de flujo en el recuadro y escribir la lista de objetos usados en la tabla. Para la confección del diagrama utilice únicamente las operaciones +,-, ·, /, asignación (←), comparaciones >, <, >=, <=, acceso a memoria con subíndices y expresiones literales en lenguaje natural. El diagrama de flujo ha de estar estructurado, ser claro y legible y ocupar sólo el espacio interior del recuadro. 7 Algoritmos José Ángel Acosta Rodríguez Problema 6. INICIO Se ha desarrollado un algoritmo para incluirlo en un cierto programa de dibujo. El algoritmo resuelve el problema de relleno de una figura cerrada en dos dimensiones. La figura viene descrita por un “mapa de bits” en blanco y negro (ver recuadro abajo). Dicha figura se describe con una matriz A de dimensiones m x n, cuyos elementos aij pueden valer “0” (color blanco) ó “1” (color negro). El algoritmo completo se muestra en el recuadro del margen derecho, el cual contiene un módulo interno, PUNTO INTERIOR, que determina si un elemento aij está en el interior de la figura o no. Dicho módulo se subdivide en otros cuatro, denominados ARRIBA, ABAJO, IZQUIERDA y DERECHA. Cada uno de estos módulos recorre la figura desde un elemento aij cualquiera hacia donde indica su nombre y hasta que encuentra un borde de la figura (ver recuadro explicativo abajo), si es que dicho borde existe. Cada módulo ARRIBA, ABAJO, IZQUIERDA y DERECHA, modifica el valor de cierta variable F. Así el primer módulo, ARRIBA, si encuentra un borde incrementa el valor de la variable F. Después el segundo módulo, ABAJO, haría lo mismo, y así sucesivamente. Si cualquiera de los módulos no detecta borde alguno, no incrementa dicha variable. De este modo, si al pasar por los cuatro módulos el punto considerado está en el interior de la figura (es decir dentro de los bordes), F deberá valer 4. NOTA: Para la confección del diagrama de flujo utilice únicamente las operaciones +,-, ·, /, asignación (←), comparaciones <, >, ≤, ≥, =, lógicas “y”, “o”, acceso a memoria con subíndices y expresiones literales en lenguaje natural. El diagrama de flujo ha de estar estructurado, ser claro y legible y ocupar sólo el espacio interior del recuadro. a) Realizar los diagramas de flujo de los módulos ARRIBA y DERECHA. Nótese que son módulos y no subprogramas. Se aconseja utilizar bucles con salida en cabeza o en medio. b) El diagrama del módulo PUNTO INTERIOR, puede optimizarse, ya que si cualquiera de sus módulos detecta que no existe un borde, el elemento aij no será un punto interior. Optimícelo usando los módulos ARRIBA, ABAJO, IZQUIERDA y DERECHA. ARRIBA aij i DERECHA IZQUIERDA ABAJO j 0 0 0 0 0 0 0 0 0 Figura original 0 0 0 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1 1 1 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 i←1 j←1 PUNTO INTERIOR SI F=4 aij ← 1 NO j←j+1 NO j>n SI i←i+1 0 0 0 1 1 1 0 0 0 NO i>m SI FIN INICIO PUNTO INTERIOR F ← 0 0 0 0 0 0 0 0 0 0 Figura rellenada 0 0 0 0 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 ARRIBA 0 0 0 1 1 1 0 0 0 ABAJO IZQUIERDA DERECHA FIN PUNTO INTERIOR 8 Algoritmos José Ángel Acosta Rodríguez a) INICIO ARRIBA INICIO DERECHA FIN ARRIBA FIN DERECHA b) INICIO PUNTO INTERIOR OPTIMIZADO NOMBRE m n A VALOR Constante entera Constante entera Matriz m x n entera DESCRIPCIÓN DEL OBJETO Número de filas Número de columnas Describe la figura a rellenar Elementos “0” o “1” de la matriz A aij Enteros i Entera Índice de filas j Entera Índice de columnas F Entera Variable que describe si un punto es interior FIN PUNTO INTERIOR OPTIMIZADO 9 Algoritmos José Ángel Acosta Rodríguez Problema 7. El código de cuenta corriente de una cuenta bancaria está compuesto por el código de entidad (4 dígitos), el código de sucursal (4 dígitos), el código de control (2 dígitos) y en número de cuenta (10 dígitos), como se muestra en la figura adjunta: Código entidad Código sucursal Código control Número de cuenta Para el cálculo de los 2 dígitos del código de control se utiliza el siguiente algoritmo, el cual calcula un dígito de control dado un número cualquiera de 10 dígitos: 1. Calcular el número N dado por la fórmula siguiente: ⎫ ⎧ 10 N =11 − mod ⎨∑ di × pi 11⎬ ⎭ ⎩ i=1 donde di el es el dígito i-ésimo del número del que se desea calcular su dígito de control, pi es la componente i-ésima de un vector dado p de 10 componentes, y mod es la operación de resto de división entera (véase nota abajo). 2. Según el valor de N, el dígito de control valdrá: a. Si N = 11, entonces el dígito de control es 0. b. Si N = 10, entonces el dígito de control es 1. c. En cualquier otro caso el dígito de control es el propio número N. Para obtener el primer dígito de control se utilizan los códigos de entidad y de sucursal del código de cuenta corriente añadiéndoles dos cero por la izquierda, y después se le aplica el algoritmo dado. Para el segundo dígito de control se le aplica el algoritmo a los 10 últimos dígitos correspondientes al número de cuenta. Se pide: a) Realizar el diagrama de flujo del algoritmo dado para un número cualquiera cuyos dígitos están almacenados como un vector U de 10 componentes. Dicho algoritmo debe almacenar en una variable denominada DC el valor del dígito de control obtenido. b) Usar el diagrama de flujo del apartado anterior como un módulo y realizar el diagrama de flujo para comprobar que los dígitos de control de un código de cuenta corriente dado, son correctos. El código de cuenta corriente está almacenado en un vector V. Es obligatorio usar el módulo creado en el apartado anterior tantas veces como sea necesario. NOTA: Para la confección del diagrama de flujo utilice únicamente las operaciones +,-, ·, /, asignación (←), comparaciones <, >, ≤, ≥, =, lógicas “y”, “o”, acceso a memoria con subíndices y expresiones literales en lenguaje natural. Además dispone de la operación resto de división y represéntela como mod(X/Y), es decir resto de dividir la cantidad X entre la cantidad Y. El diagrama de flujo ha de estar estructurado, ser claro y legible y ocupar sólo el espacio interior del recuadro correspondiente. 10 Algoritmos José Ángel Acosta Rodríguez a) b) INICIO MÓDULO INICIO FIN MÓDULO NOMBRE N DC U VALOR Constante entera Constante entera Vector de dimensión 10 V Vector i Índice DESCRIPCIÓN DEL OBJETO Número resultado del algoritmo Valor del dígito de control obtenido Contiene el número dato para el algoritmo Contiene el código de cuenta corriente Para vectores FIN 11 Algoritmos José Ángel Acosta Rodríguez Problema 8. Para hacer ciertas labores de fotoimpresión en una imprenta se hace un negativo especial de las fotos. Este negativo se les aplica a fotos en blanco y negro. Las fotos representan figuras cerradas descritas por un “mapa de bits” en blanco y negro. Dicha figura se representa con una matriz A de dimensiones m x n, cuyos elementos aij pueden valer “0” (color blanco) ó “1” (color negro). Se desarrolla un algoritmo para hacer el negativo, incluído el borde. Dicho algoritmo contiene un módulo interno denominado PUNTO INTERIOR que determina si un elemento aij está en el interior de la figura o no. Dicho módulo se subdivide en otros cuatro (ver figura abajo a la derecha), denominados ARRIBA, ABAJO, IZQUIERDA y DERECHA. Cada uno de estos módulos recorre la figura desde un elemento aij cualquiera hacia donde indica su nombre y hasta que encuentra un borde de la figura, si es que dicho borde existe (ver figura explicativa abajo a la izquierda). Cada módulo ARRIBA, ABAJO, IZQUIERDA y DERECHA, modifica el valor de la variable F. Así el primer módulo, ARRIBA, si encuentra un borde incrementa el valor de la variable F. Después el segundo módulo, ABAJO, haría lo mismo, y así sucesivamente. Si alguno de los módulos no detectase borde alguno, no se modificaría dicha variable. De este modo, si al pasar por los cuatro módulos el punto considerado está en el interior de la figura (es decir dentro de los bordes), F deberá valer 4. NOTA: Para hacer los diagramas de flujo utilice únicamente las operaciones +,-, ·, /, asignación (←), comparaciones <, >, ≤, ≥, =, lógicas “y”, “o”, acceso a memoria con subíndices y expresiones literales en lenguaje natural. El diagrama de flujo ha de estar estructurado, ser claro y legible y ocupar sólo el espacio interior del recuadro. 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 Figura original 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 Figura en negativo 1 1 1 1 0 1 1 1 1 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 Se pide: c) Realizar el diagrama de flujo del módulo ABAJO dentro del módulo PUNTO INTERIOR. Nótese que son módulos y no subprogramas. Suponga “i”, “j” ya conocidas para este apartado. d) Realizar el diagrama de flujo que resuelve el problema al completo usando, obligatoriamente el módulo PUNTO INTERIOR. Es decir, se desea que dada una figura original (matriz A m x n, ya leida y en memoria), el algoritmo realice el negativo y lo escriba en la matriz B. Nótese que también se hace el negativo del borde de la figura. INICIO PUNTO INTERIOR F ← 0 ARRIBA NO F=1 SI ABAJO F=2 ARRIBA NO SI IZQUIERDA DERECHA aij NO i F=3 SI IZQUIERDA ABAJO j DERECHA FIN PUNTO INTERIOR 12 Algoritmos José Ángel Acosta Rodríguez INICIO ABAJO (apartado a) INICIO apartado b FIN ABAJO (apartado a) NOMBRE m n A VALOR Constante entera Constante entera Matriz m x n entera aij Enteros i j Entera Entera F Entera B Matriz m x n entera DESCRIPCIÓN DEL OBJETO Número de filas Número de columnas Figura original Elementos “0” o “1” de la matriz A Índice de filas Índice de columnas Variable que describe si un punto es interior Negativo de la figura original FIN apartado b 13 Algoritmos José Ángel Acosta Rodríguez Problema 9. La asignación de diputados en una provincia se rige por la ley D’Hont. En una versión muy simplificada la ley se aplica como se describe a continuación. Suponga que se tiene una provincia a la que se le asignan 5 diputados y donde hay 4 formaciones políticas relevantes (F1, F2, F3 y F4). Después de la cita electoral se tendrá un vector de votos (V) donde cada elemento del vector hace referencia a los votos de una determinada fuerza política. Dicho vector (V), además, estará ordenado en número de votos de forma decreciente. Con este vector de votos se crea una matriz A como la que aparece en la figura y donde cada columna se corresponde con el vector V dividido por 1,2,3, … y así sucesivamente hasta el total de los 5 diputados asignados. VOTOS (V) V÷2 V÷3 V÷4 V÷5 F1 F2 F3 120000 60000,0 40000,0 20000,0 13333,3 82000 41000,0 27333,3 13666,7 9111,1 55000 27500,0 18333,3 9166,7 6111,1 F4 25000 12500,0 8333,3 4166,7 2777,8 A4x5 Ahora sólo falta escoger las 5 cifras más altas de la matriz A y asignar a cada una un diputado (celdas sombreadas en la figura). En este caso, el resultado será el que aparece en la tabla al margen derecho. Dicho resultado puede almacenarse en un vector de diputados ordenado (D). Dado un vector de votos V, ya ordenado en forma decreciente, de una provincia a la que se le asignan N diputados y en la cual existen M fuerzas políticas relevantes, se pide: c) Realizar un diagrama de flujo tal que dado el vector de votos V, ya ordenado, cree la matriz A de dimensiones M x N. d) Realizar un diagrama de flujo que cree un vector de diputados D, donde cada elemento será el número de diputados asignado a la fuerza política correspondiente. Este apartado debe resolverse en dos partes. Primero crear un módulo que calcule el máximo de la matriz A y su posición. Después resolver el apartado usando dicho módulo el número de veces que sea necesario. NOTA: Los vectores y matrices conocidos, ya están almacenados en memoria y el resto inicializados a cero. Para la elaboración del diagrama de flujo utilice únicamente las operaciones +,-, ·, /, asignación (←), comparaciones <, >, ≤, ≥, =, lógicas “y”, “o”, acceso a memoria con subíndices y expresiones literales en lenguaje natural. El diagrama de flujo ha de estar estructurado, ser claro y legible y ocupar sólo el espacio interior del recuadro correspondiente. FUERZAS POLÍTICAS DIPUTADOS (D) F1 F2 F3 F4 2 2 1 0 DESCRIPCIÓN DEL OBJETO Número de fuerzas políticas NOMBRE VALOR M Constante N Constante Número de diputados Vector de dimensión M Vector de dimensión M Matriz de dimensiones MxN Vector conocido de votos V D A Vector de diputados Matriz para el cáculo del número de diputados i Índice Para vectores / matrices j Índice Para vectores / matrices k Índice Para vectores / matrices 14 Algoritmos José Ángel Acosta Rodríguez a) b) INICIO apartado a) INICIO MÓDULO apartado b) FIN apartado a) b) INICIO apartado b) FIN apartado b) FIN MÓDULO apartado b) 15 Algoritmos José Ángel Acosta Rodríguez Problema 10. Realice en el recuadro adjunto el diagrama de flujo de un programa que lea desde teclado una lista de valores enteros positivos y los almacene en un vector v. La lectura por teclado finaliza cuando se introduzca un valor negativo. A continuación, el programa preguntará otros 2 números por teclado (en cualquier orden), y recorrerá el vector v, calculando el porcentaje de elementos que están entre el menor y el mayor de ambos números (incluidos los extremos). Ejemplo: Lista: 24, 30, 5, 9, 85, 19 Intervalo: 20, 5 Nºs en intervalo: 5, 9, 19. Resultado: 50% NOTA: Para hacer los diagramas de flujo utilice únicamente las operaciones +,-, ·, /, asignación (←), comparaciones <, >, ≤, ≥, =, lógicas “y”, “o”, acceso a vectores y matrices con subíndices y expresiones literales en lenguaje natural. El diagrama de flujo ha de estar estructurado, ser claro y legible y ocupar sólo el espacio interior del recuadro. NOMBRE TIPO DESCRIPCIÓN DEL OBJETO 16 Algoritmos José Ángel Acosta Rodríguez Problema 11. Un antiguo videojuego llamado “Space Invaders” tenía como objetivo defender la Tierra de una invasión enemiga. La escena en la pantalla estaba formada por una matriz de puntos monocromos, blancos y negros. Los objetos estaban formados simplemente por un “mapa de bits” en negro sobre fondo blanco. Describiremos aquí la escena mediante una matriz A de dimensiones m x n, cuyos elementos akj pueden valer “0” (color blanco) ó “1” (color negro). Las formas de los objetos y la escena son exactamente como aparecen en la figura: las naves invasoras, la nave del jugador y los proyectiles. Los movimientos de los objetos son: las naves invasoras pueden moverse libremente, mientras que la nave del jugador sólo puede moverse en horizontal; los proyectiles de la nave del jugador salen desde el disparador y se mueven verticalmente hacia arriba; y los proyectiles de las naves invasoras se mueven en vertical hacia abajo. Teniendo en cuenta que los módulos son parte del algoritmo del videojuego, se pide: a) Dada una posición apq de colisión entre entre el proyectil del jugador y una nave invasora, realice el diagrama de flujo de un módulo que se denomine DESTRUYE, tal que destruya la nave invasora, es decir borre por completo la nave invasora de la escena. Este módulo no debe detectar la colisión sólo destruir la nave invasora. Para facilitar la resolución tenga en cuenta que todas las naves enemigas están contenidas en submatrices de 3x3 y que están siempre separadas horizontalmente como mínimo por un hueco de 3x3 (ver figura). b) Dada la posición akj de disparo del proyectil del jugador, realice el diagrama de flujo de un módulo que anime paso a paso el movimiento del proyectil del jugador desde que sale del disparador (ver figura) hasta que, o bien se encuentra con una nave invasora o bien llega al final de la escena sin acierto. Si hay una colisión con una nave invasora debe usar el módulo DESTRUYE del apartado anterior para destruirla proporcionándole las coordenadas correspondientes. NOTA: Para hacer los diagramas de flujo utilice únicamente las operaciones +,-, ·, /, asignación (←), comparaciones <, >, ≤, ≥, =, lógicas “y”, “o”, acceso a vectores y matrices con subíndices y expresiones literales en lenguaje natural. El diagrama de flujo ha de estar estructurado, ser claro y legible y ocupar sólo el espacio interior del recuadro. 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 invasoras 0 0 0 Naves 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Proyectil 0 0 0jugador 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Disparador 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Posición apq 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Posición 0 0 de 0 salida 0 0del0proyectil 0 0 akj 0 0 (a0“1” 0antes 0 de0 salir 0 el0proyectil) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Nave 0 del 0 jugador 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 Algoritmos NOMBRE m n A José Ángel Acosta Rodríguez TIPO Constante entera Constante entera Matriz m x n entera akj Enteros p Entera q Entera k Entera j Entera DESCRIPCIÓN DEL OBJETO INICIO DESTRUYE (apartado a) Número de filas Número de columnas Escena original Elementos “0” o “1” de la matriz A Índice de fila de la colisión del proyectil Índice de columna de la colisión del proyectil Índice de la fila de salida del proyectil Índice de la columna de salida del proyectil FIN DESTRUYE (apartado a) INICIO apartado b) FIN apartado b) 18 Algoritmos José Ángel Acosta Rodríguez Problema 12. Se ha diseñado un robot limpia piscinas llamado Cleaning-Robot (ver figura). El funcionamiento del robot es el siguiente: . NOMBRE TIPO 1. El usuario lo arroja a la piscina en cualquier zona. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Cleaning-Robot 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Número par de celdas 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Índice de fila q Entera t Entera F Entera 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0Posición 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 0 Entera 0 0 0 0 0 0 0 0 0 0 Entera Entera Describe la piscina Índice de columna Índice de la fila de salida del robot Índice de la columna de salida del robot Variable para el sentido de avance del robot Variable que indica al robot el fin de limpieza NOTAS: Para hacer los diagramas de flujo utilice únicamente las operaciones +,-, ·, /, asignación (←), comparaciones <, >, ≤, ≥, =, lógicas “y”, “o”, acceso a vectores y matrices con subíndices y expresiones literales en lenguaje natural. El diagrama de flujo ha de estar estructurado, ser claro y legible y ocupar sólo el espacio interior del recuadro. 2. Recuadro B: rellenar los bloques del diagrama de flujo, sabiendo que existen dos módulos predefinidos: el primero denominado MOVER y hace que el robot se mueva celda a celda a la posición (contigua) indicada por los índices (k,j); y el segundo denominado RETROCESO que lleva al robot sin limpiar desde la posición (M,N) hasta la (1,1). 0 0 0 0 0 0 0 0 0 0 Enteros Número de filas NO SE PUEDEN DEFINIR NUEVAS VARIABLES 1. Recuadro A: aquí debe ir la actualización de los índices de la siguiente posición del robot en la matriz. El avance del robot debe ser celda a celda y en el sentido el indicado en la figura al margen del Recuadro (ver diagrama de flujo). 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Descripción del 0 movimiento 0 0 0 del 0 Robot 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 akj k j p Elementos “0” o “1” de la matriz A A Se desea hacer un algoritmo tal que, dada una posición cualquiera (p,q) de partida del robot, éste limpie por completo la piscina sin pasar dos veces por el mismo sitio. Para ello se pide completar en los recuadros A y B del diagrama de flujo dado, lo siguiente: 0 0 0 0 0 0 0 0 0 0 Número de columnas N 3. Una vez ha calculado su posición, por ejemplo apq, éste puede moverse sólo paralelo a las paredes de la piscina y celda a celda de la matriz (ver figura abajo). 0 0 0 0 0 0 0 0 0 0 Constante entera Constante entera Matriz M x N entera M 2. El robot se hunde y una vez llega al fondo calcula su posición respecto a los bordes de la piscina. Para ello el robot digitaliza la piscina mediante una matriz de puntos A de dimensiones M x N, cuyos elementos akj pueden valer “0” (zona aún sucia) ó “1” (zona limpiada). La digitalización la hace de modo que siempre deja un número par de celdas desde el mismo hacia las paredes (ver figura). DESCRIPCIÓN DEL OBJETO 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 a0pq 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Número par de celdas Número par de celdas Número par de celdas 19 Algoritmos José Ángel Acosta Rodríguez INICIO k ← p, j ← q t ← 1 F ← 0 Recuadro A akj ← 1 ← j j + t Sentido de avance SI j = N t ← -1 k ← k + 1 NO SI j = 1 t ← 1 k ← k + 1 NO j = N y k = M NO Recuadro B SI SI NO NO F = 1 SI FIN 20
Puede agregar este documento a su colección de estudio (s)
Iniciar sesión Disponible sólo para usuarios autorizadosPuede agregar este documento a su lista guardada
Iniciar sesión Disponible sólo para usuarios autorizados(Para quejas, use otra forma )