Вы находитесь на странице: 1из 61

OLIMPIADA MEXICANA DE INFORMÁTICA

EN QUINTANA ROO

COMPENDIO DE EJERCICIOS
PARA LOS ENTRENAMIENTOS

Tulum Quintana Roo Noviembre 2005


11ª Olimpiada Mexicana de Informática 2006.

CONTENIDO
FASE 1
1. LÓGICA Y MATEMÁTICA
1.1. ACERTIJOS
1.2. RAZONAMIENTO LÓGICO
1.3. RAZONAMIENTO MATEMÁTICO

FASE 2
2. PROGRAMANDO A KAREL EL ROBOT
3. INTRODUCCIÓN
3.1. ¿QUÉ ES?
3.2. EL MUNDO DE KAREL
3.2.1. CALLES
3.2.2. AVENIDAS
3.2.3. ESQUINAS
3.2.4. ZUMBADORES
3.2.5. MUROS
3.2.6. ORIENTACIÓN
3.2.7. MOCHILA (BOLSA) DE ZUMBADORES
4. VENTANAS DEL SIMULADOR
4.1. MUNDO
4.2. PROGRAMA
4.3. EJECUTAR
5. PROGRAMACIÓN EN KAREL
5.1. ESTRUCTURA DEL PROGRAMA
5.2. COMANDOS BÁSICOS
5.3. VARIABLE DE KAREL
5.4. CONDICIONES DE KAREL
5.5. OPERADORES LÓGICOS
5.6. SENTENCIAS DE CONTROL
5.6.1. SI / ENTONCES
5.6.2. SI / ENTONCES / SINO
5.6.3. REPETIR / VECES
5.6.4. MIENTRAS / HACER
5.7. FUNCIONES
5.7.1. DEFINE-NUEVA-INSTRUCCIÓN / COMO
5.7.2. RECURSIVIDAD
6. PROGRAMAS EJEMPLO

Fase 1: Lógica y Matemática


11ª Olimpiada Mexicana de Informática 2006.
FASE 3
7. RESOLVIENDO PROBLEMAS CON UN LENGUAJE DE
PROGRAMACIÓN
7.1. ¿CÓMO RESOLVER UN PROBLEMA?
7.2. TÉCNICAS DE PROGRAMACIÓN
7.2.1. BÚSQUEDAS
7.2.2. ORDENAMIENTOS
7.2.3. RECURSIVIDAD
7.3. ESTRUCTURAS DE DATOS
7.3.1. ARREGLOS
7.3.1.1. UNIDIMENSIONALES
7.3.1.2. MULTIDIMENSIONALES
7.3.2. PILAS
7.3.3. COLAS
7.3.4. ARCHIVOS DE TEXTO

Fase 1: Lógica y Matemática


11ª Olimpiada Mexicana de Informática 2006.

PRESENTACIÓN

Una de las actividades que se realizan con la computadora es su programación, pero en qué
consiste, es un conjunto de instrucciones y operaciones lógicas y matemáticas que se le
proporcionan a la computadora, para la realización de determinada acción o actividad.

Pero, para que la computadora pueda hacer lo que nosotros queremos o necesitamos, se
requieren de dos cosas muy importantes las cuales son:

1. Un conjunto de operaciones mentales, aritméticas y lógicas para poder organizar una


posible solución.
2. Un lenguaje de programación que se encargue de traducir las instrucciones que le
proporcionamos a las computadora – que está en un lenguaje que entendemos – a un
lenguaje que la computadora pueda entender – que está en un lenguaje que no podemos
entender-.

Lo que se busca con este compendio es integrar un conjunto de ejercicios de tipo lógico y
matemático, para que los alumnos puedan practicar y planteen soluciones más elaboradas y
logren obtener mejores resultados.

Uno de los principales problemas que presentan los alumnos que al momento de resolver
exámenes de olímpicos, es que no pueden plantear sus soluciones, es decir que ya saben
qué es lo que deben de hacer, pero no saben cómo hacerlo.

La realización de estos ejercicios no garantizará que los alumnos puedan hacer un examen a
la perfección, pero si los realizan a conciencia, podrán tener un criterio más amplio para
resolver exámenes de diversos tipos y con la práctica podrán ellos mismos establecer sus
propios métodos para resolver problemas.

El presente compendio consta de tres partes principales, que corresponden a las fases
estatales que se llevan a cabo en la Olimpiada de Informática y son las siguientes:

La primera etapa la he denominado de Fase 1: Lógica y Matemática, que presenta


ejercicios para que los alumnos puedan desarrollar estas habilidades.

La segunda fase la he denominado Fase 2: Programando a Karel el Robot, que consiste


en plantear soluciones en la computadora, a través de un simulador, que hace más sencillo
el planteamiento de nuestras solución.

La tercera fase la he denominado Fase 3: Resolviendo Problemas con un Lenguaje de


Programación, que consiste en temas relacionados específicamente con un lenguaje de
programación. Los lenguajes oficiales de la Olimpiada Mexicana de Informática son: Pascal,
C, y C++.

Fase 1: Lógica y Matemática


11ª Olimpiada Mexicana de Informática 2006.

FASE LÓGICA Y MATEMÁTICA

En esta sección se presentan un conjunto de ejercicios con acertijos, ejercicios lógicos y


ejercicios matemáticos, para que los alumnos puedan practicar y desarrollar sus habilidades
lógicas, ya que son importantes para resolver problemas utilizando una computadora.

En la primera parte los ejercicios están dirigidos para que los alumnos puedan desarrollar sus
habilidades lógicas, a partir del contexto de los enunciados, es decir que los textos no
contienen truco alguno y utilizando el razonamiento se pueden llegar a los resultados
correctos.

En la segunda parte se presentan ejercicios, de razonamiento lógico, donde los alumnos


deberán hacer uso de sus habilidades deductivas y de procedimientos lógicos, para poder
resolver los problemas planteados.

En la tercera parte, se presenta un conjunto de ejercicios matemáticos, donde el alumno


tendrá que aplicar algunos conceptos matemáticos, así como de fórmulas y de operaciones o
procedimientos matemáticos, para poder solucionar los problemas, además de un poco más
de lógica.

Aconsejo que los problemas se resuelvan sin la ayuda de calculadoras, para que los alumnos
puedan utilizar procesos de razonamiento, que es uno de los principales obstáculos con los
que se enfrentan al momento de resolver un examen de este tipo.

Además de que en los exámenes presenciales no se permitirá el uso de calculadoras de


ningún tipo, aun cuando solamente unos cuantos problemas requieren de mayor laboriosidad
para su solución.

Estos son algunos, problemas que se presentan como material de estudio, si en sus
escuelas cuentan con otros ejercicios pueden aplicarlos y compartirlos para poder enriquecer
el presente material.

Fase 1: Lógica y Matemática 1


11ª Olimpiada Mexicana de Informática 2006.

1.- ACERTIJOS
1.- Tuercas y clavos
Hay tres cajas, una contiene tornillos, otra tuercas y la otra clavos. El que ha puesto las
etiquetas de lo que contenían se ha confundido y no ha acertado con ninguna. Abriendo una
sola caja y sacando una sola pieza ¿Cómo se puede conseguir poner a cada caja su etiqueta
correcta?

2.- ¿La contraseña?


Un grupo de policías está investigando a un grupo de delincuentes que trafican en un local
bien custodiado. Desde un coche camuflado vigilan la entrada al local. Quieren infiltrar a un
grupo de policías de paisano, pero no saben la contraseña. En ese momento llega un cliente.
Llama a la puerta y desde el interior le dicen: “18”. El cliente responde: “9”. La puerta se abre
y accede al interior. Los policías se miran, creen tener la respuesta. Pero deciden esperar.
Viene otro cliente. Desde dentro le dicen: “8”. Él responde: “4”. La puerta se abre. Los
policías sonríen. “Ya lo tenemos. Se trata de responder la mitad del número que te dicen
desde dentro”. Llega otro cliente. Desde dentro dicen: “14”. El cliente contesta: “7”. La puerta
se abre. “¿Lo ves?” dice el jefe de policía. Deciden enviar a un agente. Llama a la puerta.
Desde dentro le dicen: “0”. El policía se queda parado. Después de unos breves segundos
responde: “0”. Se oye una ráfaga de disparos y el policía muere. Los agentes que hay en el
coche se quedan sorprendidos, pero deciden enviar a otro agente. Desde dentro se oye: “6”.
El policía contesta muy convencido: “3”. Pero la puerta no se abre. Se oye una ráfaga de
disparos y el policía muere. ¿Por qué?

3.- Las dos corredoras


A la una del mediodía Loli y Pepa salen las dos de un mismo punto y empiezan a correr por
una pista circular. Loli corre en el sentido de las agujas del reloj y Pepa en sentido contrario.
A las tres de la tarde las dos se encuentran otra vez en el punto de partida. Si Loli ha dado
10 vueltas a la pista y Pepa ha dado 14 vueltas, ¿cuántas veces se han cruzado durante la
carrera?

4.- En la Isla de los Zombies


En una isla cercana a Haití mitad de los habitantes fueron embrujados por un Vudú y
transformados en Zombies, esos Zombies no se comportan según las tipicas convenciones:
Hablan y no se pueden distinguir de los seres humanos normales, la única diferencia es que
los zombies mienten siempre y los humanos siempre dicen la verdad. La situación es
enormemente complicada por el hecho que aunque los nativos entiendan nuestro idioma a la
perfección un antiguo tabú le prohibe de usar palabras extranjeras cuando hablan. Por lo cual
al hacerle una pregunta que requiere una respuesta de si o no, ellos contestan "Bal" o "Da",
uno de los cuales significa si y el otro no. El problema es que no sabemos si "Bal" o "Da" es
si o no.
Tú te encuentras en esa isla y quieres casarte con la hija del rey. El rey desea que su hija se
case sólo con alguien muy inteligente. Así que tienes que superar una prueba. La prueba
consiste en hacer al brujo del rey una sola pregunta. Si el contesta "Bal" entonces podrás
casarte con la hija del rey, pero si contesta "Da" habrás fracasado en la prueba. El problema
consiste en encontrar una pregunta tal que, independientemente del hecho de que el brujo
sea humano o Zombie e independientemente del hecho de que "Bal" signifique si o no, el
brujo conteste "Bal".

Fase 1: Lógica y Matemática 2


11ª Olimpiada Mexicana de Informática 2006.
5.- Los cofres de Porsia
En el mercado de Venecia de Shaquespare, Porsia tenía 3 cofres, uno de oro, uno
de plata y otro de plomo, y en uno de ellos estaba su retrato.
El pretendiente de Porsia tenía que escoger un cofre, y si hubiera sido tan afortunado o sabio
de escoger aquel con el retrato, habría podido pedir la mano de Porsia. Porsia hizo esculpir
sobre los cofres las siguientes inscripciones:

Oro: El retrato esta en este cofre.


Plata: El retrato no esta en este cofre.
Plomo: El retrato no esta en el cofre de oro.

Porsia explicó al pretendiente, que cuando mucho una de las 3 afirmaciones era
verdadera. ¿Cuál de los cofres contenía el retrato?.

El pretendiente escogió de forma correcta y se casaron y vivieron felices y contentos por lo


menos por un cierto tiempo, un día Porsia hizo el siguiente razonamiento: "podemos decir
que mi esposo mostró poseer una cierta inteligencia al escoger el cofre correcto, pero el
problema no era muy difícil. Hubiera tenido que hacerlo más arduo para poder tener un
esposo verdaderamente inteligente." Así se divorcio inmediatamente para poder escoger un
esposo más inteligente, esta vez hizo esculpir las siguientes inscripciones:

Oro : El retrato no está en el cofre de plata


Plata: El retrato no está en este cofre
Plomo: El retrato está en este cofre.

Porsia explico al pretendiente que por lo menos una de las tres afirmaciones era verdadera y
que por lo menos una era falsa. Como quiso el destino, el pretendiente no fue nada menos
que el primer esposo. Resolvió este problema y se casaron otra vez

6.- Los ocho panes


Cabalgaban, camino a Bagdad, por el desierto dos beduinos cuando encontraron a un viejo
jeque tumbado en la arena hambriento y sediento. Los beduinos ofrecieron un poco de agua
al jeque y cuando se había repuesto contó que había sido asaltado por un grupo de
enmascarados. El jeque preguntó a los beduinos si llevaban alguna cosa para comer, a lo
cual el primer beduino contestó que aun le quedaban cinco panes y el segundo contestó que
le quedaban tres panes. El jeque propuso que compartaran entre los tres toda esta comida y
al llegar a Bagdad les recompensaría con 8 monedas de oro. Así lo hicieron y al llegar a
Bagdad al día siguiente se habían comido entre los tres los ocho panes y el jeque les quiso
recompensar con 8 monedas, por lo que entregó cinco monedas al primer beduino y tres
monedas al segundo. Pero el primer beduino dijo:

El reparto no es correcto. Si yo di cinco panes me tocan 7 monedas y a mi compañero, que


solo aportó tres panes, solo le toca 1 moneda!
Porqué dijo esto el beduino?

7.- Las cinco esclavas


El joven príncipe Alejandro acudió al reino de Bagdad para pedir la mano de la joven
princesa hija del poderoso emir Casimiro III. El emir propone al príncipe un reto para que

Fase 1: Lógica y Matemática 3


11ª Olimpiada Mexicana de Informática 2006.
pueda demostrar que es digno de su hija la princesa. El reto consiste en la resolución del
siguiente enigma: - Poseo cinco esclavas, - dijo el emir - dos de las esclavas tienen los ojos
negros y tres esclavas tienen los ojos azules. Las que tienen los ojos negros siempre dicen la
verdad y las que tienen los ojos azules siempre mienten. Dentro de unos instantes estas
cinco esclavas serán conducidas ante nuestra presencia con los ojos vendados. Sin verles
los ojos, tendrás que descubrir, sin error posible, las que tienen los ojos negros y las que
tienen los ojos azules y para ello podrás hacer hasta tres preguntas a tres de las esclavas.
¿Con qué tres preguntas pudo el príncipe descubrir el color de los ojos de las esclavas?

8.- Fichitas
Estamos frente a un tablero en el que hay un número desconocido de fichas, las cuales son
por una cara blancas y por la otra negras. Sabemos que 10 de estas fichas están con la cara
blanca hacia arriba y el resto con la negra hacia arriba. Están mezcladas sin ningún orden. Si
tenemos los ojos vendados, ¿como podemos formar 2 montones en los que haya el mismo
nº de fichas con la cara blanca hacia arriba?

9.- El testamento del jeque


Al morir el jeque, ordenó que se distribuyeran sus camellos entre sus tres hijos de la
siguiente forma: la mitad para el primogénito, una cuarta parte para el segundo y un sexto
para el más pequeño. Pero resulta que el jeque sólo tenía once camellos, con lo que el
reparto se hizo realmente difícil, pues no era cosa de cortar ningún animal. Los tres
hermanos estaban discutiendo, cuando ven llegar a un viejo beduino, famoso por su
sabiduría, montado en su camello. Le pidieron consejo y este dijo:- Si vuestro padre hubiese
dejado doce camellos en vez de once no habría problemas. -Cierto, pero sólo tenemos once-
respondieron los hermanos, a lo que el beduino contestó: - tomad mi camello, haced el
reparto y no os preocupeis que nada perderé yo en la operación.
¿En qué se basa el beduino para afirmar tal cosa?

10.- Los tres sabios


En un reino en crisis, el rey Magnánimus pretende eliminar a sus tres sabios consejeros, pero
les propone una acertijo que si lo resuelven les perdonará la vida. El rey coloca a los tres
sabios en fila india. - "Dispongo de cinco sombreros, tres blancos y dos negros. Os colocaré
a cada uno de vosotros uno de estos sombreros en lo alto de vuestra cabeza, de manera que
seréis capaces de ver el sombrero que lleva el que está enfrente vuestro pero no el vuestro
(de modo que el último sabio de la fila ve a los otros dos, el segundo sabio solo ve al primero
y el primer sabio no ve a ninguno de los otros sabios). El juego consiste en que debéis de
adivinar lo antes posible el color del sombrero que lleváis y justificar como lo habéis
adivinado. Pero si uno de vosotros se equivoca, morireis los tres!!!" - dijo el Rey. Entonces el
Rey colocó a cada uno de los tres uno de los sombreros blancos y guardó los dos negros.
Empezó preguntando al último de la fila que no respondió nada. Continuó preguntando al
segundo que tampoco respondió. Y cuando le tocó al primero, éste respondió: - "Majestad,
¡mi sombrero es blanco!!" -.
¿Por qué?.

11.- LAS TRES SOMBRAS


Al llegar a una bifurcación del camino de la vida eterna, uno de cuyos ramales conduce al
cielo, y el otro al infierno, nos encontramos con tres figuras borrosas a las que no podemos
reconocer. Sabemos que se trata de 3 personajes conocidos: GHANDI, GOEBBELS y

Fase 1: Lógica y Matemática 4


11ª Olimpiada Mexicana de Informática 2006.
GAULLE. El primero, claro, siempre dice la verdad, el segundo miente siempre, y el tercero a
veces miente, y a veces no. Por supuesto, con la niebla no se distinguen, y solo tenemos dos
(DOS (2)) preguntas (del tipo SI / NO) para hallar el camino hacia la salvación. Podemos
hacer las 2 preguntas a un mismo personaje, o 2 distintos. ¿Cuales son estas dos
preguntas?.

12.- LA BOMBILLA:
Estás frente a una puerta cerrada que conduce a una habitación a oscuras en la cual hay una
bombilla, pero donde estás no puedes ver si está encendida o apagada. Lo que sí hay donde
estás, son cuatro interruptores de los cuales sólo uno enciende la bombilla del otro lado de la
habitación. Puedes activar o desactivar los interruptores cuantas veces quieras, pero sólo
puedes entrar en la habitación una sola vez. ¿Cómo harás para determinar cuál es el
interruptor que enciende la bombilla?

13.- Las monedas falsas


Había un viejo muy tacaño que tenia muchas monedas de oro. Los hijos y su familia lo
presionaban para que las metiera al banco para intereses y mantenerlas protegidas. El caso
es que el viejito pone las monedas en 10 saquitos. En la noche uno de los hijos toma una
bolsa y falsifica las monedas (quedan igual) y las pone las nuevas en el saco. El hijo se gasta
las monedas. Al otro día en el banco el hijo le cuenta al padre lo que hizo y el padre muy
desilusionado manda a traer al encargado del banco una báscula y le dice al hijo que si
adivina en que saco están las monedas falsas se puede quedar con todas las monedas y si
no adivina no le vuelve a hablar. Puede pesar todas las monedas de los sacos que quiera en
la báscula, pero solo puede usar la báscula una vez. Se sabe que las monedas verdaderas
pesan 1 gr. cada una y las falsas un 10% menos.

Fase 1: Lógica y Matemática 5


11ª Olimpiada Mexicana de Informática 2006.

ALGORITMOS
1. BARAJEANDO
La mayoría de las personas, cuando juegan baraja, ordenan las barajas que les tocaron de
chico a grande, para poder ubicarlas con facilidad. El método más común de ordenamiento
es el siguiente:

Al inicio se tienen cero barajas en la mano, por lo que se toma la primera baraja y se coloca
en la mano. De la segunda a la quinta carta (suponiendo que se está jugando poker),se toma
la nueva carta y se compara con las cartas que se tienen en la mano, comenzando con la
que esté en el extremo izquierdo de la mano. Si la nueva carta es mayor que la carta con la
que se está comparando, se pasa a la siguiente carta a la derecha y se vuelve a comparar,
en caso de que no exista ninguna carta a la derecha, la nueva carta se inserta en el extremo
derecho de la mano. Si la nueva carta es menor o igual a la carta con la que se esta
comparando, la nueva carta se inserta a la izquierda de la carta con la que se comparó.

a) Suponiendo que las cartas que te tocaron son (5,3,4,10,2)¿Cuál es el número de


comparaciones que tendrás que hacer para que las barajas queden ordenadas en tu mano?
_____ comparaciones
b) En una baraja normal hay 13 valores posibles de cartas, dependiendo del juego que te
toque tendrás que realizar mas o menos comparaciones.¿Cuál es el número máximo de
comparaciones que se pueden hacer con un juego de 5 cartas? _____ comparaciones
c) ¿Cuál es el número mínimo de comparaciones? _____ comparaciones
d)Si fuera un juego de 13 cartas.¿Cuál sería el máximo número de comparaciones?
_____ comparaciones
e)Para un juego de 13 cartas,¿Qué cartas y en que orden son las que te obligan a hacer el
mayor número de comparaciones? _____ comparaciones

2.- JUEGOS CON PALILLOS


Existen 11 palillos en una mesa con 2 jugadores, en su turno cada uno de ellos puede
recoger 1,2 ó 3 palillos según desee. El jugador que recoge el último palillo pierde el juego.

a)¿Siendo el primer jugador puedes asegurar tu victoria siempre? Si _____ No _____


b)¿Cuántos palillos tienes que recoger en la primera tirada para hacerlo? _____ palillos
c)¿Cuántos palillos quedan antes de que el otro jugador haga su última tirada? _____ palillos
d)Contesta las mismas preguntas si existen 30 palillos. Si _____ No _____
En la primera tirada _____ palillos
En la última tirada quedan _____ palillos
e)¿Puedes siempre asegurar tu victoria sin importar cuántos palillos haya en la mesa?
Si _____ No _____
Una variante del juego es que existen 30 palillos y puedes elegir recoger 1,2,3,4,5 ó 6.En
este caso gana quien recoge el último palillo.
f)¿Siendo el primer jugador puedes asegurar la victoria?
Si _____ No _____
g)¿Cuántos tienes que recoger en la primera tirada para hacerlo?
En la primera tirada _____ palillos
h)¿Cuántos palillos quedan antes de que el otro jugador haga su última tirada?
En la última tirada quedan _____ palillos

Fase 1: Lógica y Matemática 6


11ª Olimpiada Mexicana de Informática 2006.

2.- RAZONAMIENTO LÓGICO


1.- Encuentra dos números enteros positivos que tienen el mismo resultado al sumarse que
el multiplicarse.
Número mayor: _________ Número menor: _________

2.- Escribe dos números enteros positivos que al multiplicarse den como resultado un
número de un solo dígito y al sumarse den uno de dos dígitos.
Número menor: ___________ Número mayor: __________

3.- Encuentra un numero de dos dígitos que es igual al doble del producto de sus dígitos.
Número: _________

4.- La edad de un padre y su hijo suman 55 años. La edad del padre es la edad del hijo con
sus dígitos al revés.¿Qué edades tienen?
El padre tiene _____años y el hijo tiene _____años

5.- En cierto torneo de tenis se utiliza una bola nueva para cada juego. Cualquier jugador al
perder un juego es eliminado y el torneo continúa hasta quedar un solo ganador. Si al torneo
entraron 111 participantes,¿cuántas bolas se utilizaron?
Se utilizaron _____bolas

6.- Hay 100 edificios a lo largo de una calle, se le encarga a un impresor hacer los números
para estos edificios, ¿Cuántos 9 va a necesitar?
Necesitará ________ números

7.- ¿Qué tan larga es una cuerda 2 metros más corta que otra que es tres veces más larga
que la primera?
Mide ______ metros

8.- Un maestro muy anticuado utiliza un gran reloj de arena para tomar el tiempo que dura su
clase, que es de 4 horas y empieza a las 9:00.Un día un alumno travieso, decide darle vuelta
al reloj de arena sin que el maestro se dé cuenta. Después de un rato el maestro lo nota y
regresa el reloj a su posición original, en ese momento son las 11:30. Ese día la clase
termina a las 3:00.¿A qué hora volteó el alumno el reloj?
A las ________ Escribe tu resultado con el formato hh:mm

9.- Tengo la misma cantidad de hermanos y hermanas, pero mis hermanos tienen el doble de
hermanas que hermanos.¿Cuántos somos?
Mujeres _____ y Hombres _____

Fase 1: Lógica y Matemática 7


11ª Olimpiada Mexicana de Informática 2006.

10.- .Observa las balanzas a continuación y di qué se debe colocar en la última balanza para
equilibrarla.

Se deben colocar _____ pez(ces), _____gallo(s) y _____ ratón(es)


*De cada tipo se puede elegir entre colocar ningún animal o colocar animales enteros.

11.- Un epitafio de una antigua tumba familiar se leía así:


Aquí yacen:
Dos abuelas con sus dos nietas
Dos esposos con sus dos esposas
Dos padres con sus dos hijas
Dos madres con sus dos hijos
Dos señoritas con sus dos madres
Dos suegras con sus dos nueras
Y sólo seis en la tumba. Todos ellos legítimos, jamás hubo incesto.
a)¿Cuántas mujeres había en la tumba?
Había _____ mujeres
b)¿Cuál era el parentesco de las abuelas de la primera frase y los padres de la tercera?
Eran _______________sus (abuelas, madres, esposas, cuñadas, hijas)

12.- Un poco antes del 14 de febrero, Karla que presumía de ser muy popular le dijo a sus
dos amigas: “Cada año recibo 100 tarjetas o más de mis admiradores” cada una de sus
amigas, incrédulas contestaron: “De seguro que son menos de 100 ” y “ Bueno, al menos
debes recibir una ”.
Si tan sólo una de las tres esta diciendo la verdad.¿Cuántas tarjetas recibe Karla?
Recibe _____ tarjetas

13.- Una persona dijo: “Todas mis corbatas son rojas, excepto dos. Todas mis corbatas son
azules excepto dos. Todas mis corbatas son cafés excepto dos.” ¿Cuántas corbatas tiene?
Tiene _____ corbatas

14.- Martha hace poco me dijo “ Ayer cuando me desperté tenía 29 años, pero el próximo
año voy a cumplir 32 ”.¿Qué día es el cumpleaños de Martha?
Es el día ______ de _________________

15.- Tres niñas van con sus padres de paseo a un río. Al llegar allí se encuentran con que tan
sólo hay un bote con 2 lugares para cruzar de un lado al otro.

Fase 1: Lógica y Matemática 8


11ª Olimpiada Mexicana de Informática 2006.
Las tres niñas se niegan terminantemente a subirse en el bote con alguno de los papás de
las otras niñas. Para mover el barco basta con que reme una sola persona y las niñas son lo
suficientemente fuertes para hacerlo.
a)¿Es posible lograr que los 6 pasen de un lado a otro? Si _____ No _____
b)¿Cuántos viajes mínimo debe realizar el barco por el río para hacerlo?(La ida y el regreso
se cuentan como 2 viajes) Se deben realizar ______ viajes

16.- Si dos patos están nadando en frente de otro pato, dos patos están nadando atrás de
otro pato y un pato esta nadando entre otros dos patos, ¿cuál es el mínimo de numero de
patos que hay nadando?
Hay mínimo ________ patos nadando

17.- Tenemos 10 sacos llenos de diferente número de canicas, al menos con 1000 cada uno.
Cada saco contiene canicas que pesan 10 gramos, excepto uno de ellos que tiene canicas
defectuosas que pesan 9 gramos cada una. Si tienes una báscula ¿cuál es el mínimo
número de pesadas que se requieren para identificar el saco que tiene las canicas de 9
gramos?
Se necesitan mínimo _______
¿Cuántas cánicas en total pesarías?
Pesaría en total _______ canicas

18. Tenemos 10 vasos puestos en fila, los primeros 5 están llenos de agua y los otros 5
están vacíos. Moviendo los vasos, lo cuál implica cambiarlo de lugar o pasar el agua de un
vaso lleno a uno vacío, ¿cual es el mínimo numero de veces que tienes que mover un baso
para que queden alternados?
Se necesita mover ______ vasos mínimo

19. Tenemos 8 pares de calcetines blancos y 10 pares de calcetines negros en una caja.
¿cuál es el mínimo numero de calcetines que hay que sacar de la caja para asegurar que
tengamos al menos un par del mismo color?
Se necesita sacar al menos ______ calcetines.

20. Un reloj antiguo tarda 7 segundos desde que empieza hasta que termina en dar 8
campanadas, ¿Cuánto tardará cuando sean las 12?
Tardará ______ segundos

21. Un amigo me dijo: "Tengo 8 hijas y cada una tiene un hermano". ¿En total cuántos hijos
hombres tiene mi amigo?
Tiene ______ hijos hombres

22. El Sr. Blanco, el Sr. Rojo y el Sr. Azul están en una junta, los tres traen corbatas de
colores como sus apellidos, sin embargo ninguna corbata corresponde a su apellido, el Sr.
Azul le pregunta al hombre con la corbata blanca si le gusta el Rojo, pero no puede escuchar
la respuesta. ¿Cuál es el color de la corbata de cada uno?

El Sr. Blanco trae la corbata de color _______ (blanco, rojo, azul)


El Sr. Rojo trae la corbata de color _______
El Sr. Azul trae la corbata de color _______

Fase 1: Lógica y Matemática 9


11ª Olimpiada Mexicana de Informática 2006.
22. Un hombre tiene una cabra un lobo y una lechuga llega a un rio y debe llevar sus
pertenencias al otro lado. El bote solo puede llevar al hombre con solo una de sus
pertenencias.

Existe otro problema aún más grave; si la cabra se queda con la lechuga seguro se la va a
comer, si el lobo se queda con la cabra seguro se la va a comer.
¿Puede el hombre lograr llegar al otro lado con todas sus pertenencias? ____ Si _____ No
¿Si lo puede lograr cuántas veces cruza el río y a quién debe transportar primero?
Cruza el río _____ veces y lleva primero a (la / el) ______

23. La familia Sotomayor formada por el Sr. Noe, la Sra. Maricela y su hijo Gerardo tienen 4
vehículos: una camioneta, un sedan, un auto nuevo deportivo y una pick-up. ¿ cuál es el
vehículo que usa cada uno y cual es el color de cada uno de los vehículos? si todas las
siguientes aseveraciones son correctas:

a) el Señor maneja el vehículo blanco todos los días, por cierto, su auto no es un sedan
b) la pick-up tiene menos millas que el auto amarillo, el verde y que el blanco
c) el auto que Gerardo maneja a la escuela no es una camioneta
d) un vehículo que es verde, tiene mas de 50 años y lo utilizan solo en desfiles de autos
antiguos.
e) la Señora prefiere manejar el vehículo rojo.
f) A Gerardo le gusto manejar el auto nuevo.
g) El Sr.Noe maneja (el/la) _______ de color _______
h) La Sra. Maricela maneja (el/la) _______ de color _______
i) Gerardo maneja (el/la) _______ de color _______

24. Un caballero se encuentra con 4 grandes dragones y para que no lo maten, debe de
saber cuáles son sus razas y colores (el caballero es daltónico y no puede distinguir los
colores).
Los Grises Racionales y los Rojos Depredadores siempre dicen la verdad, los Rojos
Racionales y los Grises Depredadores así como los Azules Racionales y los Azules
Depredadores siempre mienten. Las pistas de los 4 dragones fueron:

A dijo:
1.- si quieres saber mi tipo C te dará una respuesta verdadera.
2.- D es Azul

B dijo:
1.- A y Yo somos Racionales
2.- 3 de nosotros son Azules

C dijo:
1.- si quieres saber el tipo de A, B te dará una respuesta verdadera
2.- solo uno de nosotros es azul
3.- todo lo que dice D es falso

Fase 1: Lógica y Matemática 10


11ª Olimpiada Mexicana de Informática 2006.
D dijo:
1.- 3 de nosotros son depredadotes
2.- A es racional
3.- A no es azul

A es un ______ (gris, rojo, azul) _______ (racional, depredador)


B es un ______ (gris, rojo, azul) _______ (racional, depredador)
C es un ______ (gris, rojo, azul) _______ (racional, depredador)
D es un ______ (gris, rojo, azul) _______ (racional, depredador)

Fase 1: Lógica y Matemática 11


11ª Olimpiada Mexicana de Informática 2006.

3.- RAZONAMIENTO MATEMÁTICO

1. El vendedor de naranjas:
Un vendedor ambulante se propuso vender una cesta de 115 naranjas a razón de 10
monedas cada 5 naranjas. En el momento de la venta cambió de opinión e hizo un montón
con las 58 naranjas más gordas y otro con las 57 más pequeñas. Las gordas las vendió a 5
monedas cada 2 naranjas y las pequeñas a 5 monedas cada 3 naranjas.
¿Era esto lo mismo que la intención primera?

2. El diablo y el campesino
Iba un campesino quejándose de lo pobre que era, dijo: daría cualquier cosa si alguien me
ayudara. De pronto se le aparece el diablo y le propuso lo siguiente:
Ves aquel puente, si lo pasa en cualquier dirección tendrás exactamente el doble del dinero
que tenias antes de pasarlo. Pero hay una condición debes tirar al rió 24 pesos por cada vez
que pases el puente.
Paso el campesino el puente una vez y contó su dinero, en efecto tenía dos veces más, tiro
24 pesos al río, y paso el puente otra vez y tenía el doble que antes y tiro los 24 pesos, paso
el puente por tercera vez y el dinero se duplico, pero resulto que tenia 24 pesos exactos y
tuvo que tirarlos al río. Y se quedo sin un peso. ¿ Cuánto tenia el campesino al principio?
¿Cuánto tenia el campesino antes de pasar por ultima vez?

3. La viejecita en el mercado:
Una viejecita llevaba huevos al mercado cuando se le cayó la cesta.
¿Cuantos huevos llevabas? - le preguntaron,
No lo se, recuerdo que al contarlos en grupos de 2, 3, 4 y 5, sobraban 1, 2, 3 y 4
respectivamente.
¿Cuantos huevos tenía la viejecita?

4. La botella de vino
Si nos dicen que una botella de vino vale 10 euros y que el vino que contiene cuesta 9
euros más que el envase, ¿cuanto cuestan el vino y el envase por separado?.

5. Llenar la piscina:
Para llenar de agua una piscina hay tres surtidores. El primer surtidor tarda 30 horas en
llenarla, el segundo tarda 40 horas y el tercero tarda cinco días. Si los tres surtidores se
conectan juntos, ¿cuanto tiempo tardará la piscina en llenarse?.

6. En el bar:
Tres amigos van a tomar café. Piden la cuenta y el camarero les dice que son 25 pesetas
por los tres cafés. Cada uno pone 10 pesetas, en total 30. Con las 5 que sobran, se queda
cada uno 1 peseta, y las otras 2 para el bote del bar. Es decir, cada uno paga 9 pesetas, que
por los tres serían 27, más las 2 de la propina, 29. ¿Donde está la peseta que falta?

7. María y Juan:
María tiene un hermano llamado Juan. Juan tiene tantos hermanos como hermanas.
María tiene el doble de hermanos que de hermanas. ¿Cuantos chicos y chicas hay en la
familia?

Fase 1: Lógica y Matemática 12


11ª Olimpiada Mexicana de Informática 2006.
8. El vagabundo:
Un vagabundo se hace un pitillo con cada siete colillas que encuentra en el suelo.
Cuantos pitillos podrá fumarse si encuentra 49 colillas?

9. Juan y Pedro:
Juan le dice a dice a Pedro: "si me das una oveja tengo yo el doble que tu" Pedro le
contesta: " no seas tan listo, dámela tu a mi, y a si tenemos los dos igual" ¿Cuantas ovejas
tiene cada uno?.

10. El tío y el sobrino:


Un tío le dice a su sobrino: " Yo tengo el triple de la edad que tú tenías cuando yo tenía la
edad que tú tienes. Cuando tú tengas la edad que yo tengo ahora, la suma de las dos
edades será de 70 años". ¿Qué edad tienen ahora ambos?

11. Las tres hijas:


Dos amigos se encuentran por la calle: el primero le pregunta al otro - qué tal están sus
hijas y cuantos años tienen, el segundo le contesta: - El producto de las tres edades es 36 y
la suma el número del portal en el que vives, el primero le dice: - entonces, me falta un dato,
y el amigo le contesta - es cierto, la mayor toca el piano. ¿Cual es la edad de cada hija?

12. La colección de monedas:


Un comerciante decide vender una colección de monedas de oro a tres coleccionistas. El
primero compra la mitad de la colección y media moneda; el segundo, la mitad de lo que
queda y media moneda y el tercero la mitad de lo que queda y media moneda. ¿Cuantas
monedas tenia el comerciante?

13. Pies por pulgadas:


Cierto individuo ordenó telefónicamente un tramo de cordel de X pies y Y pulgadas, y
descubrió que el dependiente se había equivocado con la orden y había intercambiado pies y
pulgadas. Como resultado, la cuerda media sólo 30% del tramo que el cliente deseaba. ¿De
qué longitud era la cuerda ordenada?

14. Un problema de balanza sin pesas:


Una bolsa contiene 27 bolas de billar que parecen idénticas. Sin embargo, nos han
asegurado que hay una defectuosa que pesa más que las otras. Disponemos de una
balanza, pero no de un juego de pesas, de manera que lo único que podemos hacer es
comparar pesos. Demuestra que se puede localizar la bola defectuosa con solo tres
pesadas.

15. La tela de araña:


Una araña teje su tela en el marco de una ventana. Cada día duplica la superficie hecha
hasta entonces. De esta forma tarda 30 días en cubrir el hueco de la ventana. Si en vez de
una araña, fueran dos, ¿Cuánto tardarían en cubrir dicho hueco?

16. La rana obstinada:


Buscando agua, una rana cayó en un pozo de 30 m de hondo. En su intento de salir, la
obstinada rana conseguía subir 3 metros cada día, pero por la noche resbalaba y bajaba dos
metros. ¿Podrías decir cuántos días tardó la rana en salir del pozo?

Fase 1: Lógica y Matemática 13


11ª Olimpiada Mexicana de Informática 2006.
17. El lechero ingenioso:
Un lechero dispone únicamente de dos jarras de 3 y 5 litros de capacidad para medir la
leche que vende a sus clientes. ¿Cómo podrá medir un litro sin desperdiciar la leche?

18. Un problema de peso:


Un tendero dispone de una balanza y cuatro pesas distintas, y estas pesas son tales que
le permiten pesar cualquier número exacto de kilogramos desde 1 a 40. ¿Qué pesa cada una
de las pesas?

19. Siempre diofanto:


¿Cual es el número de 3 cifras, que cumplen la condición de que el producto de dichas
cifras es igual a su suma?

20. Si nos falta la luz:


En un cajón hay 12 pares de calcetines negros y doce pares blancos. No habiendo luz en
la habitación, usted quiere coger el mínimo número de calcetines que le asegure que
obtendrá al menos un par del mismo color. ¿Cuantos calcetines deberá tomar del cajón?

21. Serie de números:


¿Podrías decir porque los siguientes números están ordenados de esta forma?
0542986731

22. Una pareja de novios en el día de San Valentín, se repartieron los chocolates de una
bolsa. Después de contar cuántos les había tocado, la novia le dijo:“ Si te doy uno, tu
tendrías el doble que yo, pero si tu me das uno, tendremos los dos la misma cantidad ”
¿Cuántos chocolates tenían?
La novia tenía _____ chocolates y el novio tenía ________chocolates

23. En la iglesia 17% dieron 5 pesos de limosna, 50% del restante 83 % dieron 10 pesos, el
resto no dio nada. ¿Cuantos pesos se juntaron en total ese domingo?
Se juntaron: ________ pesos

24. Al ir caminando por una calle que tiene 30 metros de largo noto, que desde que inicia hay
árboles a los lados, para ser exactos tiene árboles cada 6 metros, uno a cada lado,
¿Cuantos árboles tiene en total la calle?
La calle tiene ________ árboles

25. Una araña muy especial, comienza a tejer su telaraña enfrente de una ventana. Cada día
logra tejer un área igual al área que había logrado tejer hasta el día anterior. Después de
30 días completa el área de toda la ventana.¿Cuántos días les llevaría a dos arañas con
la misma característica tejer la ventana?(Cada araña teje un día el equivalente a lo que
había tejido ella misma hasta el día anterior)
Les lleva ____días

26. Una criadora de gallinas recogió en una canasta los huevos y los llevo a vender al
mercado. En el camino un hombre que llevaba prisa tropezó con ella, tirando la canasta.
Todos los huevos se rompieron, el hombre apenado quiso pagárselos. Pero al preguntarle
cuántos eran la mujer contesto: “No lo recuerdo, pero sé que cuando intenté dividirlos en

Fase 1: Lógica y Matemática 14


11ª Olimpiada Mexicana de Informática 2006.
paquetes de 2, 3, 4, 5 y 6 siempre sobro uno. Así que los tuve que dividir en grupos de 7 ”
¿Cuál es el número mínimo de huevos que existía en la canasta?
Había _____ huevos

27. Dos madres con sus dos hijas fueron a comer pizza. La dividieron en partes iguales
utilizando 5 cortes y se la repartieron. Cada una comió la misma cantidad de
partes,¿cuántas comió cada una?
Cada una comió _____ piezas

28. Ponemos una espora en un tubo de ensayo. Cada hora la espora se divide en 3 partes
cada una del mismo tamaño de la original y con las mismas características de
crecimiento. Si se colocó a las 01:00 hrs y a las 07:00 hrs el tubo estaba completamente
lleno.
¿A qué hora estaba a la tercera parte de lleno?
Estaba a la tercera parte a las _______ (escribe la hora en el formato hh:mm)
Si el tubo de ensayo esta colocado adentro de una caja con volúmen 243 veces mayor
que el tubo.
¿A qué hora se llenará también la caja?
Se llenará la caja a las _______ (escribe la hora en el formato hh:mm)

29. Un hombre entró a una tienda y compro una sombrilla por $100. Para pagar le dio al
vendedor un billete de $500. El vendedor fue al banco para obtener cambio, pero 2 horas
mas tarde, el banquero fue a la tienda reclamando que el billete de $500 era falso, así que
el tendero tuvo que cambiárselo por uno verdadero y aceptar el falso de regreso
Entre el cliente estafador y el banco, ¿cuanto dinero perdió la tienda?
Perdió _______ pesos

30. Observa la figura de abajo, y determina cuantos diferentes caminos te pueden llevar del
inicio al fin, solo te puedes mover en la dirección de inicio a fin, no puedes regresar.
Existen _______ caminos diferentes

¿Y en la siguiente figura cuántos?


Existen _______ caminos diferentes

Fase 1: Lógica y Matemática 15


11ª Olimpiada Mexicana de Informática 2006.

31. 10 flechas son lanzadas al blanco mostrado abajo, una de ellas cae fuera completamente,
si el total de los puntos sumados es 100, ¿cuántas flechas cayeron en cada parte del
blanco?
Cayeron ______ flechas en la zona de 8 puntos
Cayeron ______ flechas en la zona de 12 puntos
Cayeron ______ flechas en la zona de 14 puntos
Cayeron ______ flechas en la zona de 18 puntos

32. Examina las 2 columnas de números de la figura. Si intercambias un cubo de la columna


1 con un cubo de la columna 2 la suma de cada uno de las torres será igual. ¿cuáles
bloques debes de intercambiar?
De la columna 1 el bloque con el número ______
De la columan 2 el bloque con el número ______

33. Ahora que ya sabes como balancear 2 columnas estas listo para balancear 3.
intercambiando un bloque de cada columna las sumas van a ser iguales. ¿Qué bloques
debes intercambiar?

De la columna 1 el bloque con el número ______


De la columna 2 el bloque con el número ______
De la columna 3 el bloque con el número ______

Fase 1: Lógica y Matemática 16


11ª Olimpiada Mexicana de Informática 2006.

34. En una clase de arte enseñan a los estudiantes a hacer una estatua con una bolsa de
barro de 1 Kg. Durante este proceso algo del barro se desperdicia, por cada 5 estatuas
que se hacen sobra suficiente barro para hacer una más, ¿Cuantas estatuas se pueden
hacer si se cuenta con 25 Kg?
Se pueden hacer ______ estatuas

35. Una barra de oro puesta en un platillo de una balanza se equilibra con 9/10 de Kg. y 9/10
de una barra igual de oro. ¿Cuánto pesa la barra de oro?
Pesa ______ kg.

36. Observa la figura de abajo en que los número están ordenados, tu tarea es reordenarlos
de tal forma que ningún número esté a un lado de su consecutivo, esto quiere decir que
no estén ordenados a derecha e izquierda, arriba y abajo o diagonalmente.

37. Un palíndromo es una palabra o número que se lee igual de derecha a izquierda que de
izquierda a derecha, como por ejemplo el 606 y el 4334.
Mientras conducía su carro por la ciudad, BOB (quien adora tanto los palíndromos que se
cambio en nombre de Juan a Bob) observa maravillado que el odómetro marca un
número palíndromo: 13,931 Km. BOB continúa manejando, 1 hora mas tarde se da cuenta
para su sorpresa que ahora el odómetro marca otro palíndromo. ¿Cuál es la velocidad
mas probable a la que iba BOB?
La velocidad a la que iba era ______ km/h

Fase 1: Lógica y Matemática 17


11ª Olimpiada Mexicana de Informática 2006.

FASE PROGRAMANDO A KAREL EL ROBOT

En esta sección se presenta un manual completo del simulador de Karel el Robot, donde se
exponen todas las funcionalidades, con las que cuenta, así como de las instrucciones,
estructuras y métodos de programación.

Karel es un robot que vive en su mundo, formado de calle y avenidas, donde su tarea
principal es buscar zumbadores, tomarlos y dejarlos en un lugar específico, sin embargo
Karrel tiene ciertos limitantes como son los muros que lo limitan para realizar mejor su
trabajo. La tarea principal de los alumnos es ayudar a Karel, a través de instrucciones
sencillas para que pueda cumplir con las tareas encomendadas.

Karel responde principalmente a dos lenguajes de programación, el primero es Pascal y el


segundo es Java, también acepta procedimientos recursivos y cuenta con una mochila donde
puede poner los zumbadores

Los que se busca con este simulador es que los alumnos se introduzcan a la programación
de computadores, de una forma sencilla y fácil de entender y no a través de conceptos
complejos y abstractos.

Fase 2: Programando a Karel el Robot 18


11ª Olimpiada Mexicana de Informática 2006.

KAREL EL ROBOT

¿QUÉ ES KAREL EL ROBOT?

Karel es una herramienta de aprendizaje que presenta los conceptos de una forma visual, lo
cual es menos abstracto que programar en un lenguaje como Pascal o C, es un Robot simple
que vive en un mundo simple y debido a que Karel y su mundo son simulados, nosotros
podemos realmente ver los resultados de un programa en acción.

EL MUNDO DE KAREL

El mundo de karel está formado por Calles y Avenidas, en las cuales tiene que desplazarse
y hacer las tareas que le indiques.

Karel puede orientarse en una de las cuatro direcciones: este, oeste, norte y sur. Sólo gira
90º cada vez, por tanto no puede orientarse hacia el nordeste. En el mundo de Karel, las
calles van de este a oeste, y son numeradas comenzando por 1. No hay números de calle
igual a 0 o negativos. Las avenidas van de norte a sur, y también están numeradas
empezando por 1. Tampoco hay números de avenida igual a 0 o negativos. Se le llama
esquina a la intersección de una calle con una avenida. Karel va de una esquina a la
siguiente en un solo movimiento.

No. DE ZUMBADORES
DESPLAZADORES

C
A MUROS
L
L
E ZUMBADORES
S
KAREL

AVENIDAS
Figura 01: Elementos del Mundo de Karel

Las calles y avenidas se pueden limitar utilizando muros, que se pueden colocar al norte,
sur, este y oeste y evitan que Karel se salga de su mundo.

Otro elemento de interés en el mundo de Karel son los zumbadores. Un zumbador es una
forma de marca que Karel puede escuchar sólo cuando se encuentra en la misma esquina
Fase 2: Programando a Karel el Robot 19
11ª Olimpiada Mexicana de Informática 2006.

que el zumbador. Karel tiene una bolsa que puede utilizar para poner los zumbadores que
vaya cogiendo. También puede hacer lo contrario, es decir, sacar los zumbadores de su
bolsa y depositarlos en las esquinas por las que va pasando. Puedes ajustar el número inicial
de zumbadores en cada esquina con el control Zumbadores.

Fase 2: Programando a Karel el Robot 20


11ª Olimpiada Mexicana de Informática 2006.

VENTANAS DEL SIMULADOR KAREL

El ambiente de trabajo de Karen esta formado por tres ventanas con las cuales se
desarrollan diferentes ejercicios de variadas complejidades.

VENTANA MUNDO

Karel vive en mundo simple el cual podemos crear utilizando la ventana “Mundo”, en esta
ventana definimos el espacio en el cual puede transitar Karel agregando muros y
zumbadores.
La definición del mundo de Karel nos permitirá hacer mas fácil o complejas las diferentes
actividades que le encarguemos al robot Karel.

A continuación definiremos las partes de la ventana de karel

Figura 02: Ventana “Mundo” del Simulador Karel el Robot

Funciones de los botones

Haga clic en este botón para crear un nuevo mundo en blanco en el cual se
agregaran los muros y zumbadores

Fase 2: Programando a Karel el Robot 21


11ª Olimpiada Mexicana de Informática 2006.

Al hacer clic en este botón se muestra el cuadro de dialogo “guardar como”


de Windows que nos permite guarda el mundo de Karel.

Figura 03: Cuadro de dialogo Guardar como

El archivo generado tiene la extensión .mdo

Permite guardar un mundo que ya existe con otro nombre. Al hacer clic en
este botón se abre el cuadro de dialogo de la figura 03.

Con este botón abrimos los mundos que tenemos creados previamente. Al
hacer clic en este botón se abre el cuadro de dialogo “Abrir” de Windows en el cual
seleccionaremos la ubicación y el nombre del mundo que se desee abrir

Fase 2: Programando a Karel el Robot 22


11ª Olimpiada Mexicana de Informática 2006.

Figura 04: Cuadro de dialogo Abrir.

En esta opción se escribe la cantidad de zumbadores


que tendrá inicialmente Karel en la mochila al ejecutar el programa.

Estos botones de navegación permiten desplazarnos en el mundo de


Karel para visualizar las calles y avenidas que no se alcancen a mostrar en la ventana del
mundo de Karel.

Agregar y quitar muros

Para agregar un muro hacemos clic en la calle o avenida que deba existir un muro, y para
eliminarlo hacemos clic en el muro.

Figura 05: Muros del mundo de Karel.

Fase 2: Programando a Karel el Robot 23


11ª Olimpiada Mexicana de Informática 2006.

Agregar y quitar zumbadores

Los zumbadores están representados con un número el cual indica la cantidad exacta de
zumbadores que existe en una esquina (intersección de una avenida y una calle).

Para agregar zumbadores hacemos clic con el botón derecho del ratón en la esquina en la
cual requerimos uno o más zumbadores, del menú emergente (figura 06) hacemos clic en la
opción que nos convenga.

Figura 06: Menú emergente

La opción N zumbadores despliega un cuadro en el cual podemos escribir el numero de


zumbadores. (máximo 99)

Para Borrar los zumbadores hacemos clic en los zumbadores con el botón derecho y en la
opción 0 zumbadores del menú emergente. (Ver figura 06)

Como situar a Karel

Karel se representa con una flecha gruesa y se le puede situar en cualquier esquina en una
de las cuatro siguientes orientaciones al Norte, Este, Sur o al Oeste. La punta de la flecha
indica la orientación y dirección en la cual se desplazara Karel.

Para situar y orientar a Karel haga clic en una de las esquinas con el botón derecho y en el
menú emergente apunte en la opción Situar a Karel y clic en una de las cuatro opciones de
orientación, vea la figura 07.

Fase 2: Programando a Karel el Robot 24


11ª Olimpiada Mexicana de Informática 2006.

Figura 07: Opciones de orientación de Karel

Orientado al Norte Orientado al Este Orientado al Sur Orientado al Oeste

Figura 08: Ejemplos de orientación de Karel

VENTANA PROGRAMA

El objetivo es el de enseñar a Karel a realizar diferentes actividades en su mundo


interactuando con sus diferentes elementos como son los muros, zumbadores, calles y
avenidas.

Para enseñar a Karel a realizar una actividad se debe codificar un programa el cual puede
tener la estructura de Pascal o Java, para lo cual nos servirá esta ventana.

La venta esta formada por dos partes: una barra de botones y un área de codificación en la
cual se escribe el código programa, la cual esta representada por un recuadro blanco el cual
en la parte izquierda se numeran las líneas de código.

Fase 2: Programando a Karel el Robot 25


11ª Olimpiada Mexicana de Informática 2006.

Figura 09: Ventana Programa

Funciones de los Botones

Elimina lo que exista el área de codificación y genera un nuevo espacio de


codificación con la estructura principal programa el cual dependerá del lenguaje
seleccionado. (Ver figura 09)

Al hacer clic en este botón se abre el cuadro de dialogo “Abrir” de Windows


mediante el se recupera recuperar un programa previamente guardado

Fase 2: Programando a Karel el Robot 26


11ª Olimpiada Mexicana de Informática 2006.

Figura 10: Cuadro de dialogo Abrir de Windows

Permite guardar en disco un programa, utilizando el cuadro de dialogo


“Guardar como” de Windows.

Figura 11: Cuadro de dialogo Guardar como de Windows.

Los programas se guardan con la extensión .txt indistintamente del lenguaje en que se haya
codificado

Fase 2: Programando a Karel el Robot 27


11ª Olimpiada Mexicana de Informática 2006.

Guarda un programa con otro nombre

Compila el programa que se haya escrito preparándolo para su ejecución. Si


el código del programa tiene algún error de sintaxis, el compilador nos muestra el error y la
posible línea en la que se encuentra el error, en caso de no existir ningún error de sintaxis
muestra el mensaje “programa compilado.

Nota: Siempre que se realice una modificación al código del programa se debe compilar
antes de ejecutarlo.

Opción para indicar en que lenguaje se codificara y compilara el


programa.

VENTANA EJECUAR

Esta ventana es una de las características que podemos resaltar de Karel debido a que nos
permite ver la forma en que se ejecuta el código del programa y las acciones que realiza
Karel por cada línea de código.

La ventana esta formada por tres partes:


En la parte superior una barra de botones que nos permite controlar la ejecución, un panel
izquierdo en el cual se muestra la ejecución del código del programa y un panel derecho en
el que se muestra las acciones que realiza Karel en su mundo.

Fase 2: Programando a Karel el Robot 28


11ª Olimpiada Mexicana de Informática 2006.

Figura 12; Ventana Ejecutar

Funciones de los Botones

Sitúa a Karel en la posición y orientación inicial para el mundo abierto en la


ventana mundo, y agrega a la mochila la cantidad de zumbadores indicada en la ventana
mundo.

Ejecuta una línea de código cada vez que hacemos clic en este botón.

Ejecuta todo el programa.

Detiene la ejecución del programa.

Muestra la cantidad de zumbadores que tiene Karel en


la mochila.

En este recuadro se establece la velocidad en que se


ejecutara el programa. A menor cantidad mayor rapidez y a mayor cantidad la ejecución
será más lenta. La velocidad esta dada en milisegundos.

Fase 2: Programando a Karel el Robot 29


11ª Olimpiada Mexicana de Informática 2006.
PROGRAMACIÓN EN KAREL

La programación de Karel se puede realizar en los lenguajes Pascal o Java, en el caso de este manual se
vera la forma de programar en Pascal el cual es un lenguaje estructurado.

Kerel cuenta con pocas condiciones y comandos. Las actividades que puede realizar son avanzar,
recoger y dejar zumbadores, al combinar esta simples actividades se pueden realizar innumerables
actividades desde las más simples como es el avanzar por una avenida o calle hasta las más complejas
como son operaciones matemáticas, ordenamientos entre otras.

ESTRUCTURA DEL PROGRAMA

El lenguaje que utilizaremos es Pascal, el cual pertenece a la clasificación de los lenguajes


estructurados.

El programa se divide principal mente en dos bloques:


Uno para definir nuevas instrucciones (funciones) comprendido entre las palabras reservadas iniciar-
programa e inicia-ejecucion.
Y el principal donde se escriben las instrucciones que debe realizar el programa, este bloque esta
delimitado por las palabras reservadas Inicia-ejecucion y termina ejecucion

El programa esta delimitado por las palabras reservadas iniciar-programa y finalizar-programa.

Bloque general del programa:

Iniciar-programa

(* Definición de nuevas instrucciones*)

Inicia-ejecución

(* Bloque principal de programa*)

Termina-ejecucion
Finalizar-programa

Sintaxis general:
- Todas las instrucciones deben terminar con un punto y coma (;).
- No distingue entre minúsculas y mayúsculas.
- Los identificadores (nombre de las instrucciones, comandos y funciones) no deben llevar:
espacios en blanco acentos, ñ
- Las instrucciones que se pongan después de la palabra Finalizar-programa no se consideran
parte del programa.
- Los comentarios se empiezan con los caracteres (* y finaliza con *), ejemplo (* Esta es una
línea de comentario *) y no se consideran parte del código del programa.

Fase 2: Programando a Karel el Robot 30


11ª Olimpiada Mexicana de Informática 2006.

COMANDOS BÁSICO.

Karel solo puede realizar cinco acciones básicas.

Comando Descripción de la acción


avanza Avanza una esquina en la dirección en la que se encuentre
gira-izquierda Gira 90 grados a la izquierda
coge-zumbador Toma un zumbador y lo agrega a su mochila
deja-zumbador Saca un zumbador de su mochila y lo deja en la esquina
sobre la que esta ubicado
apagate Desconecta a Karel

Consideraciones:
- Si intentamos avanzar atreves de una pared karel marca un error y se desconecta
- Karel solo puede girar a la izquierda, por lo cual si queremos que gira a la derecha debemos
hacer que Karel gire 3 veces.
- Si intentamos dejar un zumbador cuando la mochila esta vacía Karel marca un error y se detiene
el programa.

VARIABLE DE KAREL

Karel solo cuenta con una variable que es su mochila en la cual podemos agregar o dejar zumbadores.

No se puede agregar otra variable.

CONDICIONES DE KAREL

La condición es una función de la situación actual de Karel, a medida que se ejecuta el programa.

Estas funciones retornan dos posibles valores, Falso o Verdadero los cuales indican si Karel se
encuentra o no en la situación indicada por la condición.

Listado de las condiciones de Karel

Detecta si existe o no un Detecta si hay o no un zumbador en la esquina Detecta la orientación


muro o en su mochila actual
frente-libre junto-a-zumbador orientado-al-este
frente-bloqueado no-junto-a-zumbador orientado-al-oeste
izquierda-libre algun-zumbador-en-la-mochila no-orientado-al-norte

Fase 2: Programando a Karel el Robot 31


11ª Olimpiada Mexicana de Informática 2006.

izquierda-bloqueada ningun-zumbador-en-la-mochila no-orientado-al-sur


derecha-libre orientado-al-norte no-orientado-al-este
derecha-bloqueada orientado-al-sur no-orientado-al-oeste

Las condiciones se deben utilizar con las estructura de control.

OPERADORES LÓGICOS

Las condiciones de Karel se pueden combinar utilizando los operadores lógicos siguiente

Operador lógico Y (and en otros lenguajes)


Operador lógico O (or en otros lenguajes)

Para agrupar comparaciones se utilizan los paréntesis.

Sintaxis:
Condición operador-lógico condición

Ejemplo:
mientras frente-libre Y derecha-bloqueada Y izquierda-bloqueada hacer inicio
deja-zumbador;
avanza;
fin;

SENTENCIAS DE CONTROL

Las sentencias de control se usan para elegir qué hacer, y/o cuantas veces hacerlo. Sin embargo, por si
solos no causan que ocurra algo. Simplemente controlan la ejecución de otras sentencias o fragmentos
de código. A continuación se lista una serie de sentencias de control de Karel:

- Si / Entonces
- Si / Entonces / Sino
- Repetir / Veces
- Mientras / Hacer
Siempre a continuación de las sentencias de control entonces, veces, sino, y hacer van seguidas de la
palabra inicio para iniciar el grupo de sentencias a ser realizado. El grupo de sentencias va seguido de
la palabra fin.

Utilizamos el par inicio/fin para un sólo parámetro o para varios, no importa el número de ellos. El
compilador devolverá una advertencia en caso de que no se siga este estilo.

Nota: Un punto y coma no debe estar a continuación de un inicio, pero sí es necesario a continuación
de un fin (excepto cuando precede una sentencia sino).

Fase 2: Programando a Karel el Robot 32


11ª Olimpiada Mexicana de Informática 2006.

Sentencia Si / Entonces

Utilizamos esta sentencia cuando queremos que Karel realice algo solo en ciertas condiciones

La forma general de la sentencia si es:

Si xxx entonces inicio


yyy;
fin;

Donde xxx es una condición, yyy son sentencias a realizar si xxx es verdadero.

… indica que puede haber más sentencias antes o después

Ejemplo:
...
Si orientado-al-sur entonces inicio
gira-izquierda;
gira-izquierda;
gira-izquierda;
fin ;
...

En este ejemplo si Karel se encuentra orientado al sur girara tres veces y quedara orientado al este.

Sentencia de control Si / Entoces / sino

Utilizamos esta sentencia cuando requerimos que Karel realiza una u otra acción dependiendo de la
condición en la que se encuentre.

Forma general:

Si xxx entonces inicio


yyy;
fin
sino inicio
zzz;
fin ;

Donde xxx es una condición, yyy son sentencias a realizar si xxx es verdadero, y zzz son las sentencias
a ejecutar si xxx es falso.

Ejemplo:
Fase 2: Programando a Karel el Robot 33
11ª Olimpiada Mexicana de Informática 2006.

Si frente-bloqueado y derecha-bloqueada y izquierda-bloqueada entonces inicio


media-vuelta;
alfombra-cuarto;
fin
sino inicio
media-vuelta;
avanza-por-el-cuarto;
fin;

En este ejemplo si las condiciones son verdaderas Karel ejecuta las funciones media-vuelta y alfombra-
cuarto (previamente definidas por el programador) y si son falsas se ejecutan las funciones media-
vuelta y avanza-por-el-cuarto.

Sentencia de control Repetir / Veces

Es útil cuando se sabe exactamente cuantas veces se debe de realizar una cosa.

Forma general:

Repetir xxx veces inicio


yyy;
fin;

Donde xxx debe ser un número entero positivo, y yyy representa cualquier número de sentencias de
Karel.

Ejemplo:
...
repetir 14 veces inicio
avanza ;
fin ;
...

En este ejemplo Karel avanza 14 esquinas a partir de su ubicación actual en la dirección en la que este
orientado.

Sentencia de control Mientras / Hacer

Extremadamente valiosa cuando no se sabe de antemano exactamente cuantas veces se necesita realizar
una tarea.
Fase 2: Programando a Karel el Robot 34
11ª Olimpiada Mexicana de Informática 2006.

La sentencia mientras/hacer nos permite repetir pasos mientras se cumple una condición, y esto nos va
a permitir programar a Karel para que ¡no sea un chico tan rígido!.

Forma general:

Mientras xxx hacer inicio


yyy;
fin;

Donde xxx debe ser una condición (una de las funciones booleanas listadas anteriormente), y yyy
representa cualquier número de sentencias de Karel.

Ejemplo:

Mientras frente-libre hacer inicio
avanza;
fin;

En este ejemplo Karel avanzara desde su posición actual hasta que se encuentre con una pared, si
encuentra una pared deja de avanzar.

FUNCIONES

Hasta ahora, le hemos dicho a Karel exactamente lo que tenía que hacer tal como necesitábamos que lo
hiciese. Esto funciona bien, pero se podrán haber dado cuenta de que siempre se utilizan secuencias de
sentencias similares. Un ejemplo es cuando Karel tiene que girar a la derecha, y nosotros le decimos
"gira-izquierda; gira-izquierda; gira-izquierda;". ¿No sería más fácil si le pudiéramos decir
simplemente "gira-derecha"?.
En otras palabras, diciendo " gira-derecha; " Karel giraría tres veces hacia la izquierda para alcanzar
nuestro objetivo. Es posible.

Una de las razones de crear nuevas instrucciones, es por evitar escribir tanto. Otra es para documentar
mejor cual es nuestro objetivo, cuando nosotros mismos u otra persona leen el programa. Como se
estarán dando cuenta, programar es una tarea muy sencilla, y ¡necesitamos toda la ayuda necesaria para
hacer las cosas correctamente!

En si una función es un segmento de programa que podemos utilizar tanta veces como sea necesario y
con tan solo hacer una llamada al nombre de la función desde cualquier parte del programa.

Sentencia Define-nueva-instruccion

Las sentencias define-nueva-instrucion están situadas en un sitio especial dentro de un programa de


Karel, justo después de la sentencia iniciar-programa.
Fase 2: Programando a Karel el Robot 35
11ª Olimpiada Mexicana de Informática 2006.

Forma gerenal:

Define-nueva-instruccion nnn como inicio


yyy;
fin;

Donde nnn es el nombre de la función, y yyy representa cualquier numero de sentencias.

Nombre de la función:
- Debe empezar con una letra.
- El nombre de la función se pude formara con las letras del abecedario (acepción de la ñ),
números y los caracteres guión alto (-) y guión bajo ( _ ) para separa las palabras.
- No debe tener espacios en blanco o cualquier carácter no valido para identificadores como
pueden ser: acentos, ñ, /, ?, *, entre otros

Las sentencias se pueden anidar, es decir pueden existir una o más funciones dentro de otra función.

Define-nueva-instruccion nnn1 como inicio



Define-nueva-instruccion nnn2 como inicio
yyy;
fin;

yyy;

fin;

Ejecutar una función

Para ejecutar una función basta con escribir el nombre de la función seguida de punto y coma, en el
lugar que desee ejecutar dicha función, puede ser dentro de otra función o el bloque principal del
programa.

Ejemplo:

Programa que hace que Karel avance desde la esquina calle 1 avenida 1 hasta un muro y regrese y se
detenga hasta que encuentre un muro.

Nombre del programa: Funcion_manual.txt

iniciar-programa

(* se crea una función que da media vuelta *)


define-nueva-instruccion media-vuelta como inicio
gira-izquierda;
gira-izquierda;
Fase 2: Programando a Karel el Robot 36
11ª Olimpiada Mexicana de Informática 2006.
fin;

(* se crea una función que avanza mientras no exista un muro*)


define-nueva-instruccion Avanza-hasta-muro como inicio
mientras frente-libre hacer inicio
avanza;
fin;

fin;
inicia-ejecucion
(* se realiza una llamada a la función avanza muro *)
Avanza-hasta-muro;

(* Se realiza una llamada funcion media-vuelta *)


media-vuelta;

(* Se realiza una segunda llamada a la función Avanza-hasta-muro *)


Avanza-hasta-muro;

apagate;
termina-ejecucion
finalizar-programa
El siguiente es un programa válido para Karel:

Figura 13: Mundo del ejemplo funcion_manual.txt

Recursividad

La recursividad es la propiedad que tienen las funciones de realizar llamadas así misma.

Una definición podría ser la siguiente:

Fase 2: Programando a Karel el Robot 37


11ª Olimpiada Mexicana de Informática 2006.
Recursividad:
Vea Recursividad.

Es decir es una función que se ejecuta a si misma un numero indeterminado de veces.

Cuado se realiza una llamada a una función (llamémosla hija) la función que realiza la llamada
(llamémosla padre) queda inconclusa y requiere que la función que fue llamada (función hija) termine
para que termine la función padre.

Con la siguiente grafica intentaremos mostrar el proceso de recursividad, inicio y finalización de las
llamadas de a la misma función.

Función original Inicia


Primera llamada inicia copia 1
Segunda llamada inicia copia 2
Tercera llamada inicia copia 3
No se cumple la condición de llamada
Termina copia 3
Termina copia 2
Termina copia 1
Termina función original

Debemos tener cuidado al utilizar la recursividad y definir claramente cuando termina la función, si no
podemos crear un ciclo infinito y nunca terminaría el programa.

Le sugerimos que la llamada a la función debe estar dentro de una sentencia de control si / entonces o si
/ entonces / sino mediante la cual controle si se realiza o no la llamada.

Debemos utilizar la recursividad cuando la solución del problema así lo requiera y no exista otra forma
de dar solución ya que utiliza una gran cantidad de recursos (memoria y procesamiento) y hace más
lenta la ejecución del programa.

Ejemplo de recursividad:

Este programa le indica a Karel que avance hasta que encuentre un muro y regrese a la ubicación
exacta en la que inicio.

Nombre del programa recursividad_ejemplo.txt

iniciar-programa

(* Crea la función media-vuelta *)


define-nueva-instruccion media-vuelta como inicio
gira-izquierda;
gira-izquierda;
Fase 2: Programando a Karel el Robot 38
11ª Olimpiada Mexicana de Informática 2006.
fin;

(* Crea la función avanza-y-regresa *)


define-nueva-instruccion avanza-y-regresa como inicio
si frente-libre entonces inicio
avanza;

(* Realiza una llamada así misma *)


avanza-y-regresa;
fin
sino inicio

(* Realiza una llamada a la funcion media-vuelta *)


media-vuelta;
fin;
avanza;
fin;

inicia-ejecucion
si frente-libre entonces inicio
avanza;
fin;

(* Se realiza la primera llamada a la función avansa-y-regresa *)


avanza-y-regresa;

media-vuelta;
apagate;
termina-ejecucion
finalizar-programa

Figura 14: Mundo del programa recursividad_ejemplo.txt

Fase 2: Programando a Karel el Robot 39


11ª Olimpiada Mexicana de Informática 2006.

3.- FASE RESOLVIENDO PROBLEMAS CON UN LENGUAJE DE


PROGRAMACIÓN

En esta sección se busca que los alumnos comprendan los conceptos de un lenguaje de
programación específico, como puede ser Pascal, C y C++, que son los lenguajes de
programación oficiales en la Olimpiada Mexicana de Informática.

Se pretende también introducir a los alumnos en las metodologías utilizadas en para resolver
problemas con un lenguaje de programación específico, como son, búsquedas,
ordenamientos, recursividad, entre otros.

Los temas que aquí se presentan pueden ser aplicables a cualquier lenguaje de
programación oficial de la Olimpiada Mexicana de Informática. Además presenta ejemplos
para res implementados en los lenguajes oficiales y algunos temas de reflexión sobre las
metodologías de programación

Presenta también algunos temas sobre estructuras de datos, que son utilizados para resolver
problemas de la Olimpiada, como los arreglos unidimensionales y multidimencionales, las
pilas, las colas y los archivos, donde todos los datos de entrada para los programas se hacen
a través de archivos de texto, así como las salidas, tomando en cuenta que tanto las
entradas como las salidas de los programas tienen un formato especial que tienen que
cumplir, ya que sino lo hacen el programa es descartado y tiene un resultado de cero.

Un dato curioso que hay que tomar en cuenta es el nombre que tiene el programa, ya que
también debe de ser el que se indica en el examen, así como el nombre de lo archivos de
salida, por que sino lo hacen así también son descartados.

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 40


11ª Olimpiada Mexicana de Informática 2006.
1. ¿CÓMO RESOLVER UN PROBLEMA?

2. TÉCNICAS DE PROGRAMACIÓN

2.1. BÚSQUEDAS
Por ©César Arturo Cepeda García.

Las búsquedas son uno de los recursos más básicos e importantes dentro de las técnicas de
programación. Realmente, resulta difícil hacer hincapié suficiente en la importancia que
representan las técnicas de búsqueda dentro del conjunto de herramientas diarias de un
programador. Pero, ¿A qué nos referimos con búsqueda? ¿Qué es lo que se está
buscando? ¿Cuándo utilizar una búsqueda?

Una computadora puede utilizarse para una gran cantidad de fines distintos, para escribir un
documento, para ver una película, para jugar, etc. En el ambiente de los concursos de
programación, la computadora se utiliza como una herramienta para resolver problemas.
Normalmente, por “resolver un problema” nos referimos a encontrar un conjunto de datos S a
partir de un conjunto de datos inicial D que cumpla con ciertas características que se
estipulan en el planteamiento del problema. Y ¿Cómo encontrar el conjunto de datos S?
Pues obviamente, ¡Buscando!

Por búsquedas entonces, nos referimos a las diferentes técnicas que hay de buscar una
solución para un problema, utilizando como herramienta una computadora. Ahora si está
pareciendo algo útil, ¿Verdad?

Desgraciadamente, las técnicas de búsqueda distan mucho de ser mágicas, y requieren de


una preparación previa. Todo mundo conoce el dicho de “Es como buscar una aguja en un
pajar”, refiriéndose a algo imposible. Y seguramente que el buscar una aguja en un montón
de paja, es una tarea más difícil que las tareas del mismo Hércules. Sin embargo, dicha
aguja podría hallarse, si se realizará una preparación previa del espacio de búsqueda. Por
espacio de búsqueda nos referimos a todos los lugares en donde pueda encontrarse una
solución, para el caso de la aguja en el montón de paja, nos referimos obviamente al montón
de paja. Supón entonces que una vez que tienes el montón de paja lo extiendes en el piso
de un cuarto de madera, de modo que en ningún lugar quede paja amontonada, después
tomas un detector de metales y comienzas a recorrer el piso del cuarto, tabla por tabla, hasta
que el detector de metales suene, si buscas en ese lugar, seguramente no tardaras mucho
en sentir un piquete en el dedo, y ¡Habrás encontrado la aguja!

Claro que para llevar a cabo dicho método de búsqueda requieres de un cuarto
suficientemente grande para distribuir la paja y de un detector de metales. Igual para buscar
soluciones con una computadora, en muchos casos requerirás de que la computadora
cuente con memoria suficiente para almacenar el espacio de búsqueda y necesitarás de una
forma de modelar las soluciones de modo que puedan ser representadas en la memoria de
una computadora.

Lo que si tienen de mágico las técnicas de búsqueda es que si las dominas, y aprendes a
definir los espacios de búsqueda podrás escribir programas que encuentren la solución

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 41


11ª Olimpiada Mexicana de Informática 2006.
correcta para el 90% de todos los problemas de la olimpiada. Tu programa algunas veces
no será muy rápido, pero siempre será correcto. 

Vayamos entonces a los pasos que se requieren para implementar una búsqueda.

El primero y más importante paso de todos es el de definir el espacio de búsqueda, este


paso, es obvio, antes de buscar, requerimos saber en donde buscar. Pero aún cuando
parezca obvio, es el paso más difícil de todos y el que menos programadores son capaces
de tomar (Como buen programador es indispensable que puedas definir el espacio de
búsqueda para cualquier problema que se te presente, de otra forma tendrás serios
problemas para poder encontrar soluciones a problemas que no sean triviales).

Para poder definir el espacio de búsqueda, es necesario conocer la estructura de la solución,


es decir, ¿Qué es la solución que me piden? ¿Qué estructura tiene? ¿Cómo se puede
representar?

Tomemos por ejemplo, un caso bien conocido por todos. Dado un conjunto de N números
enteros escribe un programa que entregue como salida una permutación de dichos números
{x1, x2, ... , xN} tal que xi ≤ xj para toda i < j. Es decir, el programa recibe como entrada N
números enteros y debe entregar como salida los mismos números pero ordenados de
menor a mayor.

El problema de ordenar un conjunto de números es un problema bien conocido, y si alguna


vez lo has resuelto estoy casi seguro de que jamás habías pensado, al resolverlo en que
estabas buscando una solución en un espacio de búsqueda. Sin embargo, la solución a este
problema, como a casi todos los problemas puede hallarse buscando en un espacio de
búsqueda definido.

¿Cuál es la estructura de la solución del problema de ordenamiento? ¿Qué es lo que se


tiene que entregar? La solución de dicho problema consta de los N números, por lo que
cualquier forma de escribir dichos N números es, de inicio, una solución potencial.

Conociendo la estructura de la solución nuestro espacio de búsqueda queda definido, lo


único que tenemos que hacer para ordenar los números es revisar todas las formas de
escribir los N números y alguna de ellas cumplirá con el criterio de ordenamiento deseado.

Una vez definido el espacio de búsqueda, para fines de implementación es conveniente


representarlo como un árbol. De nuevo, esto no es posible en todos los casos, pero si en la
gran mayoría. ¿Cómo podemos entonces modelar nuestro espacio de búsqueda como un
árbol? Bueno, tenemos que escribir N números, alguno de ellos tendrá que ir primero ¿No?
Podemos entonces crear un árbol en el que cada nivel agreguemos un número, cuando
lleguemos al nivel N habremos agregado todos los números y tendremos todas las maneras
posibles de escribir los N números. Abajo se muestra el árbol anterior.

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 42


11ª Olimpiada Mexicana de Informática 2006.

De la figura anterior puede observarse que si revisamos todos los caminos de este árbol, uno
de ellos (o más si hay números repetidos) será la solución que buscamos. Así es que, como
podrás ver, incluso problemas tan inocuos como el de ordenar un conjunto de números
puede resolverse buscando en un espacio de soluciones potenciales. Recorrer todo el
espacio de búsqueda de un problema puede ser muy lento, por ejemplo para la ordenación el
espacio de búsqueda es de N! Mientras que los algoritmos más comunes son de N logN,
muuuuuuucho más rápidos que N!. Sin embargo, lo importante de definir el espacio de
búsqueda es que te da una idea mucho más clara del problema. Además de que rara vez es
necesario buscar en todo el espacio, muchas veces el simple hecho de representar el árbol
te indica podas que te pueden ahorrar muchos pasos, por ejemplo, para la ordenación, si en
una rama se agregó un número mas chico al último número que se tenía, entonces podemos
estar seguros de que la solución no esta en ese camino y podemos cortar esa rama del
árbol.

Como mencione al principio, me es difícil expresarles lo IMPORTANTE que resulta definir el


espacio de búsqueda para un problema, la claridad que esto les da en la solución, y sobre
todo el hecho de que, únicamente pueden estar seguros de tener la solución correcta, si
buscaron en todo el espacio de búsqueda, o si demostraron que la solución no podía estar
en ninguna de las áreas en las que no buscaron.

Las técnicas de búsqueda son técnicas de programación que permiten recorrer


metódicamente un espacio de búsqueda para encontrar una solución. Las técnicas de
búsqueda más comunes son dos búsqueda en profundidad y búsqueda en amplitud, ambas
sirven para buscar una solución cuando el espacio de búsqueda esta modelado como un
árbol. A continuación se describe brevemente cada uno de ellos.

 Búsqueda en profundidad: Esta búsqueda, como su nombre lo indica, trata de llegar


siempre lo más profundo que pueda, en cada paso, si aún no ha encontrado la
solución, trata de bajar un nivel en el árbol, si no es posible bajar más, entonces

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 43


11ª Olimpiada Mexicana de Informática 2006.
regresa un nivel y trata de bajar por la siguiente rama que todavía no haya recorrido.
Las búsquedas en profundidad por lo general se implementan por medio de una
función recursiva.
 Búsqueda en amplitud: Esta búsqueda, recorre el árbol nivel por nivel, es decir, en el
primer paso busca la solución entre todos los nodos del primer nivel del árbol, si no
encuentra la solución, entonces baja un nivel y la busca entre todos los nodos del
segundo nivel, y de esa manera recorre cada uno de los niveles hasta encontrar la
solución. Las búsquedas en amplitud por lo general se implementan con una cola.
Las búsquedas en amplitud son especialmente útiles cuando lo que se desea es la
solución que este más cercana a la raíz del árbol, ya que al ir recorriendo nivel por
nivel, la primera solución que se encuentra es aquella que esta más cercana a la raíz.

2.2. ORDENAMIENTOS

INTRODUCCIÓN
Por ©César Arturo Cepeda García.

Cuando se analiza y compara el desempeño de diferentes algoritmos, se presta una especial


atención al tiempo de corrida del algoritmo. El tiempo de corrida de un algoritmo, se entiende
como el tiempo que le toma al algoritmo calcular el resultado a partir de los datos de entrada.
¿Por qué es importante el tiempo de corrida de un algoritmo? Porque si conocemos o al
menos tenemos una idea del tiempo de corrida de un algoritmo podemos saber que tanto va
a tardar en entregarnos la respuesta, y podemos decidir, si la esperamos, nos vamos a tomar
un café o si mejor regresamos después de una semana.

Aunque las computadoras de hoy en día son muy rápidas comparadas con sus similares de
hace algunos años, y son capaces de llevar a cabo millones de operaciones en un segundo,
resulta fácil encontrar ejemplos de problemas y soluciones que tardarían años en
solucionarse.

Cuando se analiza el tiempo de corrida de un algoritmo, mas que el tiempo exacto que
tardará el algoritmo en milisengudos, lo que importa es la función de crecimiento del
algoritmo, la función de crecimiento de un algoritmo, nos da una idea de que tanto aumentará
el tiempo de corrida según aumente el tamaño de la entrada. Por lo general, la función de
crecimiento de un algoritmo se expresa como la multiplicación de una constante y una
función que depende del tamaño de la entrada, es decir, c f(n) donde n es el tamaño de la
entrada.

Tomemos por ejemplo el problema de ordenar una lista de números. Se tiene un conjunto de
números A{x1, x2, ... , xn} un algoritmo de ordenación debe entregar como salida una
permutación del conjunto A tal que xi <= xj para cualquier i < j. Es decir debe ordenar los
números del conjunto de chico a grande.

Ordenar una lista de números es quizá la operación más común en las computadoras,
cientos de programas ordenan datos para poder trabajar con ellos, debido a eso, la cantidad
de algoritmos de ordenación que hay es muy grande, así como el tiempo que se ha dedicado
a estudiarlos, muy extenso. Para este apunte de análisis de complejidad vamos a estudiar

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 44


11ª Olimpiada Mexicana de Informática 2006.
principalmente 2 de los algoritmos más famosos de ordenación. La ordenación por
inserción(Insertion Sort) y la ordenación por mezcla(Merge Sort).

La ordenación por inserción tiene una función de crecimiento f(n) = n2, mientras que la
ordenación por mezcla tiene una función de crecimiento f(n) = n lg n donde lg n representa
el logaritmo base 2 de n. Para demostrar el porque es necesario estudiar el análisis de
complejidad, comparemos estos dos algoritmos. Supongamos que el mejor programador del
mundo implemento la ordenación por inserción en lenguaje máquina logrando una constante
de 2, por lo que el tiempo total de corrida será T=2 n2, donde n representa la cantidad de
números que queremos ordenar. Ahora supongamos que un programador promedio
implementa la ordenación por mezcla utilizando un lenguaje de alto nivel obteniendo una
constante de 50, por lo tanto el tiempo total de corrilda de la ordenación por mezcla será de
T=50 n lg n. Supongamos además que tenemos una computadora capaz de ejecutar
10,000,000 de operaciones por segundo.

Comparemos ahora el desempeño de ambas soluciones, supongamos primero que


queremos ordenar 1000 números.

Tinsersión = 2 (1000)2 = 2,000,000 => 0.2 segundos


Tmezcla = 50 (1000) (11) = 550,000 => 0.055 segundos

Como se observa, el desempeño de la ordenación por mezcla es mucho mejor, la diferencia


se va haciendo más drástica conforme varía el tamaño de la entrada, por ejemplo si
quisieramos ordenar 100,000,000 de números los tiempos serían
Tinsersión = 2 (100000000)2 = 20,000,000,000,000,000 un poco mas de 63 años!!!!!!!
Tmezcla = 50 (100000000) (27) = 135,000,000,000 3 horas con 45 minutos.
Mientras que la ordenación por inserción tomaria todo el resto de sus vidas, la ordenación
por mezcla apenas y necesitaria menos de 4 horas. Por eso vale la pena analizar un
algoritmo antes de implementarlo!

ORDENACION POR INSERCION

La ordenación por inserción es un algoritmo eficiente para ordenar pequeñas cantidades de


elementos. La ordenación por inserción funciona de la misma manera que la mayoria de las
personas ordena una mano de barajas. Se comienza con una la mano izquierda vacia, y la
mano de barajas, boca abajo en la mesa. Entonces vamos recogiendo una a una las barajas
de la mesa y las insertamos en la posición correcta en la mano izquierda. Para encontrar la
posición correcta, comparamos la nueva baraja con las que tenemos en la mano, de derecha
a izquierda. En todo momento, las barajas que tenemos en la mano izquierda se encuentran
ordenadas.

A continuación presentamos un pseudocódigo para implementar el ordenamiento por


inserción, nuestro procedimiento toma como entrada un arreglo A[1..n] que contiene una
secuencia de elementos de longitud n.

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 45


11ª Olimpiada Mexicana de Informática 2006.

ORDENAMIENTO-INSERCION (A)
1 desde j:=2 hasta Longitud(A) haz inicio
2 llave:=A[j]
3 i:=j - 1
4 mientras (i > 0) y (A[i] > llave) haz inicio
5 A[i + 1] := A[i]
6 i:=i - 1
7 fin-mientras
8 A[i + 1]:=llave
9 fin-desde

El código funciona de la siguiente manera, inicialmente tenemos el arreglo A con los


elementos desordenados. Como se explico en el primer párrafo la ordenación por inserción
busca siempre tener ordenada la parte izquierda del arreglo, e ir tomando uno a uno los
elementos del lado derecho para insertarlos en su posición.

En la línea 1 del algoritmo, tenemos un ciclo que irá moviendo j desde 2 hasta el numero de
elementos de A en este caso denotado por Longitud(A). ¿Por qué desde 2? Recordemos
que al inicio tenemos el lado izquierdo vacio y tomamos elementos del lado derecho para
insertarlos en su posición correcta. Sin embargo la posición del primer elemento es trivial, ya
que un conjunto de 1 elemento siempre está ordenado! Por lo tanto no tiene caso buscar la
posición del primer elemento.

Para cada índice, a partir del 2, el elemento que se está insertando se compara con los
elementos ya ordenados de derecha a izquierda con el ciclo mientras de la línea 4. Aqui
pueden suceder dos cosas, si el elemento que se está insertando es menor que el elemento
ordenado, entonces el elemento ordenado se recorre un lugar hacia la derecha (asignación
de la línea 5). Si el elemento que se está insertando es mayor o igual, entonces se coloca en
ese lugar (asignación de la línea 8). Una vez que se encontro la posición del elemento, se
avanza al siguiente índice. Cuando j sea igual a Longitud(A) + 1 el algoritmo termina y
tenemos que los elementos en A están ordenados.

Para que puedas apreciar mejor el funcionamiento de este algoritmo te recomendamos


seguirlo en papel con un arreglo de unos 5 números.

Revisemos ahora el costo computacional de ordenar por medio de la técnica de inserción,


para esto revisemos de nuevo nuestro código

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 46


11ª Olimpiada Mexicana de Informática 2006.

#veces que
ORDENAMIENTO-INSERCION (A) costo se ejecuta
1 desde j:=2 hasta ongitud(A) haz inicio c1 n
2 llave:=A[j] c2 n-1
3 i:=j – 1 c3 n-1
4 mientras (i > 0) y (A[i] > llave) haz inicio c4 Sum(2,n,tj)
5 A[i + 1] := A[i] c5 Sum(2,n,tj -
6 i:=i – 1 c6 1)
7 fin-mientras 0 Sum(2,n,tj -
8 A[i + 1]:=llave c7 1)
9 fin-desde 0
n-1

Para este ejemplo usamos la notación SUM(a,b,f(j)), que significa, la sumatoria desde j=a,
hasta j=b de la función f(j).

Para analizar un algoritmo, los pasos a seguir son basicamente 2, el primer paso es asignar
un costo computacional a cada línea del código, este costo computacional, que en la tabla
esta representado por c1, c2, ... , c7, está determinada por la velocidad de la máquina y la
naturaleza de la función, por ejemplo una suma requiere menos tiempo que una
multiplicación. Determinar este costo no es sencillo, ya que varía de máquina a máquina y
de arquitectura a arquitectura, por lo que muy rara vez se hará de manera exacta, sin
embargo vale la pena tener presente que existe. El segundo paso es ver cuantas veces va a
ser ejecutada cada línea de código, y está es la parte que más nos interesa, por lo que la
analizaremos paso a paso para nuestro ejemplo.

La línea 1 se ejecuta una vez por cada índice del arreglo, esto es desde 2 hasta
Longitud(A)+1 por lo que en total será ejecutado n veces, donde n es el número total de
elementos del arreglo.

Las líneas 2,3 y 8 se ejecutan el mismo número de veces que la 1 menos uno. Hay que
recordar que el ciclo desde (for), hace una última revisión para el caso en el que ya no
cumple con la condición. Por lo tanto estas líneas se ejecutan n-1 veces.
Entramos ahora a las líneas 4, 5 y 6 del algoritmo, estas líneas son las que se encargan de
buscar la posición correcta del elemento j. Si recordamos el funcionamiento del algoritmo,
para cada índice j se recorre la parte del arreglo ordenada de derecha a izquierda buscando
su posición, en el momento en que se encuentra su posición se termina el ciclo mientras.
Por lo tanto la función f(j) dependerá de cuantas comparaciones se tengan que hacer para
encontrar la posición del elemento j.

Como puede verse del último punto del analisis, la cantidad de veces que se ejecutan las
líneas 4, 5 y 6 no es fijo, sino que depende de la entrada. En la mayoría de los algoritmos, el
tiempo de ejecución dependerá de la entrada, por lo que la mayoria de las veces se puede
hacer un análisis de peor caso y análisis del caso promedio. En la teoría de la
computación lo más importante es el análisis del peor caso, este análisis busca cual sería
el tiempo de corrida del algoritmo con la peor entrada posible. Al obtener este tiempo, nos
damos una idea de que es lo más que puede llegar a tardar nuestro algoritmo.

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 47


11ª Olimpiada Mexicana de Informática 2006.
Para el caso de la ordenación por inserción, puede verse que el peor caso posible es que la
entrada estuviera ordenada en orden inverso, es decir, de grande a chico y nosotros lo
queremos ordenar de chico a grande, ya que en este caso, las líneas 4, 5, 6 se ejecutarían j-
1 veces para cada índice. En este caso el tiempo total de corrida sería:

T=c1*n + (c2 + c3 + c7)*(n-1) + c4*SUM(2,n,j) + (c5 + c6)*SUM(2,n,j-1)


Sabemos que: SUM(2,n,j)=( n2 + n)/2 - 1 y que SUM(2,n,j-1)=( n2 - n)/2 por lo que si
sustituimos tenemos que el tiempo total de corrida del peor caso seria:
T=c1*n + (c2 + c3 + c7)*(n-1) + c4*(( n2 + n)/2 - 1 ) + (c5 + c6)*(( n2 - n)/2 )
Para facilitar el análisis, consideremos que todas las constantes tienen el mismo valor, es
decir c1=c2=c3=c4=c5=c6=c7=c entonces nos queda que
T=c*n + (3c)*(n-1) + c*(( n2 + n)/2 - 1 ) + (2c)*(( n2 - n)/2 )
T=1.5cn2 + 3.5cn - 4c

Donde se puede apreciar claramente que el tiempo de corrida del ordenamiento por inserción
en el peor caso es una función cuadratica de n.

Cuando se analizan algoritmos, en general sólo importa el termino de la función que crece
más rápido, y se eliminan las constantes, por lo tanto en el caso del ordenamiento por
inserción, el término que crece más rápido es el término cuadrático, por lo que se dice que el
ordenamiento por inserción tiene una complejidad de O(n2).

Es conveniente que revises todo este análisis una y otra vez hasta que lo entiendas
perfectamente, ya que el analizar la complejidad de tus algoritmos es muy importante en las
ciencias de la computación y por lo tanto en la olimpiada.

ORDENACION POR MEZCLA

La ordenación por mezcla (MergeSort) utiliza un acercamiento al problema de ordenación


muy diferente al utilizado por la ordenación por inserción. El ordenamiento por mezcla utiliza
la técnica de Divide y Vencerás. La técnica de Divide y Vencerás utiliza básicamente tres
pasos:

Divide: Dividir el problema en un cierto número de sub problemas.


Vence: Soluciona los problemas de manera recursiva. Si el tamaño de los sub problemas es
suficientemente pequeño, simplemente resuélvelos de la manera mas obvia.
Combina: Combina el resultado de los sub problemas para obtener la solución al problema
original.

La ordenación por mezcla se apega estrictamente a la técnica. La idea del algoritmo es la


siguiente:

Divide: Divide la secuencia de n elementos en dos sub secuencias de n/2 elementos.


Vence: Ordena ambas sub secuencias de manera recursiva.
Combina: Mezcla las dos sub secuencias ordenadas para obtener la solución del problema.
Para la solución recursiva cada sub secuencia a su vez se divide en dos sub-subsecuencias,
y así hasta obtener una sub secuencia de tamaño 1, en este momento se detienen la
recursión, ya que una sub secuencia de tamaño uno, siempre está ordenada.

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 48


11ª Olimpiada Mexicana de Informática 2006.
La clave del ordenamiento por mezcla es precisamente la rutina que mezcla las dos sub
secuencias ordenadas en una sub secuencia ordenada en el paso de Combinación. En este
ejemplo usaremos para esa función un procedimiento llamado Mezcla(A,p,q,r) donde A es
un arreglo y p, q y r son índices del arreglo tales que p <= q < r. El procedimiento asume
que los subarreglos A[p..q] y A[q + 1..r] están ordenados. El procedimiento mezcla estos
dos subarreglos para formar un único arreglo ordenado en A[p..r].

Para explicar como funciona el procedimiento Mezcla volvamos al ejemplo de las barajas.
Supongamos ahora que se tienen dos montones de barajas, ordenados con las barajas hacia
arriba, y deseamos mezclarlos en un único montón ordenado con las barajas hacia abajo. Al
inicio ambos montones tienen a su carta más chica hasta arriba, el paso básico de nuestro
algoritmo es comparar las barajas en la parte superior de cada montón, retirar la que sea
más chica y ponerlas en nuestro montón de salida. Al quitar una baraja de uno de los
montones, queda expuesta la siguiente baraja, por lo que podemos seguir, si alguno de los
montones se llegara a terminar, entonces tomamos el montón que quedo y lo ponemos todo
en nuestro montón de salida y listo, terminamos!

A continuación implementamos el procedimiento Mezcla. Aunque este procedimiento no se


analizará tan minuciosamente como el del ordenamiento por inserción, debe poder verse que
su complejidad es de O(n) donde n=r - p + 1, es decir el número total de elementos a
mezclar. Esto se debe a que cada elemento de cada uno de los dos submontones, se movio
al montón de resultado únicamente una vez, por lo que si hay n elementos, el procedimiento
tardará un tiempo proporcional a n.

Mezcla(A,p,q,r)
1 n1:=q - p + 1
2 n2:=r - q
3 Crea arreglo L[1..n1 + 1]
4 Crea arreglo R[1..n2 + 1]
5 desde i:=1 hasta n1 haz
6 L[i]:=A[p + i - 1]
7 desde j:=1 hasta n2 haz
8 R[j]:=A[q + j]
9 L[n1 + 1]:=infinito
10 R[n2 + 1]:=infinito
11 i:=1
12 j:=1
13 desde k:=p hasta r haz inicio
14 Si L[i] <= R[j] entonces inicio
15 A[k]:=L[i]
16 i:=i + 1
17 Si-No entonces inicio
18 A[k]:=R[j]
19 j:=j + 1
20 fin-Si-entonces
21 fin-desde

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 49


11ª Olimpiada Mexicana de Informática 2006.
En resumen, el procedimiento Mezcla funciona como sigue:

Las líneas 1 y 2 calculan el largo del primer y segundo sub-arreglos.


Las líneas 3 y 4 apartan memoria suficiente para los dos sub-arreglos.
Los ciclos desde de las líneas 5, 6, 7 y 8 copian ambos sub-arreglos a los arreglos L y R.

En las líneas 9 y 10 se inicializa el último término de L y R a infinito, esto es muy importante,


ya que aquí el infinito nos sirve para saber cuando ya se terminó uno de los sub-
arreglos. Aunque en cuestión práctica no existe tal cosa como "infinito" en las computadoras,
se suele usar algún valor que previamente hayamos establecido como nuestro "infinito".

El ciclo desde que inicia en la línea 13 va desde p hasta r, es decir se ejecuta un número de
veces igual a la suma de los elementos de ambos sub-arreglos. El funcionamiento de este
ciclo es la idea básica del algoritmo. Compara el primer elemento no mezclado de cada sub-
arreglo y retira el menor, avanzando hacia el siguiente elemento del sub-arreglo de donde se
retiro el elemento.

Con el procedimiento Mezcla podemos implementar nuestra ordenación por mezcla. El


código del algoritmo queda de la siguiente forma

Ordena-Mezcla(A,p,r)
1 Si p < r entonces inicio
2 q:=(p + r) div 2
3 Ordena-Mezcla(A,p,q) // ORDENA LA MITAD IZQUIERDA
4 Ordena-Mezcla(A,q+1,r) // ORDENA LA MITAD DERECHA
5 Mezcla(A,p,q,r)
6 fin-Si-entonces

los recursivos no siempre resulta algo muy sencillo, sin embargo para el caso de la
ordenación por mezcla se pueden seguir ciertos pasos que llevan a su análisis.

Como vimos anteriormente, la técnica de divide y vencerás se basa en tres pasos básicos.
Como con la ordenación por inserción sea T(n) el tiempo total que tarda el algoritmo en
ordenar n elementos. Cuando n es suficientemente chico, digamos n <= c, entonces
resolvemos el problema de la manera obvia, para este caso nuestro programa tarda un
tiempo constante, por lo que podemos decir que tiene una complejidad de O(1). En general,
supongamos que la division de nuestro problema nos entrega a subproblemas, cada uno de
tamaño 1/b (para el caso de la ordenación por mezcla, tanto a como b son iguales a 2). Si
tomamos que D(n) es el tiempo que tardamos en dividir el problema en subproblemas, y
C(n), el tiempo que tardamos en combinar los subproblemas en una solución, entonces
tenemos que

Hay un "teorema maestro" que sirve para resolver recurrencias de esta forma, sin embargo
para varios casos, como el de la ordenación por mezcla, se puede ver de manera intuitiva
cual va a ser el resultado. Revisemos paso a paso cada una de las partes.
Dividir: Para dividir, basta con cálcular cual es la mitad del arreglo, esto, se puede hacer sin
ningún problema en tiempo constante, por lo que tenemos que para la ordenación por mezcla
D(n) = O(1)
Fase 3: Resolviendo Problemas con un Lenguaje de Programación 50
11ª Olimpiada Mexicana de Informática 2006.
Vencer: Como dividimos el problema a la mitad y lo resolvemos recursivamente, entonces
estamos resolviendo dos problemas de tamaño n/2 lo que nos da un tiempo T(n) = 2T(n/2)
Combinar: Vimos anteriormente que nuestro Mezcla era de orden lineal, por lo que tenemos
que C(n)=O(n)
Para sustituir, sumamos D(n) + C(n) = O(n) + O(1) = O(n), recordemos que para el análisis
de complejidad únicamente nos importa el término que crezca más rápido. Por lo que
sustituyendo en la recurrencia tenemos que:

donde c representa una constante igual al tiempo que se requiera para resolver un problema
de tamaño 1.Sabemos que n sólo puede ser dividido a la mitad lg n veces, por lo que la
profundidad de nuestra recursión será de lg n, también del funcionamiento del algoritmo
podemos ver que cada vez que dividamos a la mitad, vamos a tener que mezclar los n
elementos, y sabemos que mezclar n elementos nos toma un tiempo proporcional a n, por lo
que resolver la recursión debe tomar un tiempo proporcional a n lg n, que de hecho es la
complejidad del algortimo. La ordenación por mezcla tiene una complejidad de O(n lg n).
Podemos comprobarlo, sustituyendo valores en la ecuación de recurrencia.

valor de n función de recurrencia tiempo total


1 c c
2 2T(1) + 2c 2c + 2c = 4c = c(2 lg(2) + 2)
4 2T(2) + 4c 8c + 4c =12c = c(4 lg(4) + 4)
8 2T(4) + 8c 24c+8c=32c=c(8 lg(8) + 8)
. . .
n 2T(n/2) + nc c(n lg(n) + n)

De la tabla anterior vemos que el tiempo real de corrida del ordenamiento por mezcla es
proporcional a n lg n + n, de nuevo, como en el análisis de complejidad únicamente nos
importa el término que crezca más rápido y en ésta función ese término es n lg n, por lo
tanto la complejidad del sistema es O(n lg n).

CONCLUSIONES

Es muy importante que siempre que piensen un algoritmo, realicen un análisis de


complejidad de su algoritmo, aunque no todos los algoritmos son tan sencillos de analizar,
para la mayoría es fácil determinar la función de crecimiento del mismo.
Determinar la complejidad de su algoritmo les puede dar una idea muy clara de cuanto
tiempo va a tardar el mismo, y en base a los tamaños de la entrada podrán determinar si su
programa correrá en tiempo o no

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 51


11ª Olimpiada Mexicana de Informática 2006.
3. ESTRUCTURAS DE DATOS
Por ©César Arturo Cepeda García.

Las computadoras adquieren su nombre de su capacidad de computar, esto quiere decir que
las computadoras son capaces de realizar cálculos sobre un conjunto de datos.

En su inicio, las computadoras se inventaron con el fin de facilitar y agilizar el procesamiento


de datos, la primera computadora, la ENIAC, se empezó a construir durante la segunda
guerra mundial, con el objetivo de calcular los parámetros correctos de disparo de la artillería
aliada, tomando en cuenta diferentes constantes, como lo eran la altitud, la velocidad del
aire, etc. Posteriormente, la UNIVAC se comercializó para universidades, dependencias de
gobierno y empresas grandes con el fin de facilitar el procesamiento de datos, ya que era
capaz de realizar algunos miles de sumas y restas por segundo. La UNIVAC era capaz de
hacer incluso algunas decenas de divisiones por segundo!

Hoy en día las computadoras se utilizan para una gran cantidad de aplicaciones, juegos de
video, relojes, calculadoras portátiles, hornos de microondas, automóviles, laboratorios de
investigación, procesamiento de imágenes, etc. Sin embargo, aún cuando podría parecer
que las computadoras han perdido el rumbo de su finalidad original, esto no es cierto. Todas
las aplicaciones actuales de las computadoras siguen siendo básicamente la manipulación y
procesamiento de datos!

Por ejemplo, en un juego de video, la computadora debe procesar una serie de datos que
representan un mundo virtual, como son, posiciones de los personajes, orientación de los
mismos, puntos de vida, capacidad de ataque, etc. con base en estos datos y la entrada del
usuario, la computadora realizará operaciones sobre los mismos y determinará para el
siguiente instante, que caracteres siguen vivos, cuales han cambiado sus puntos de vida, etc.
En un automóvil la computadora recibe datos de los sensores del auto y con base en los
mismos, determina la cantidad de combustible y aire que debe introducir a los pistones para
el óptimo rendimiento del carro.

Y así, por inverosímil que parezca, todas las aplicaciones de las computadoras en el mundo
actual se basan en el procesamiento de los datos adquiridos para obtener el resultado
buscado.

Ya sabemos que el principal objetivo de las computadoras es el de realizar cálculos a un


conjunto de datos, pero, ¿De dónde obtiene los datos? ¿Los recibe uno por uno, o todos a la
vez? ¿Dónde los almacena? ¿Los procesa todos de manera simultanea o uno por uno?
Aunque existen varios modelos computacionales, el más común cuenta con un espacio de
almacenamiento llamado "memoria" y una Unidad Central de Procesos (CPU). En la
memoria se almacenan los datos y el programa que procesa los mismos, la Unidad Central
de Procesos se encarga de ejecutar los comandos del programa, al final de la ejecución los
datos han sido procesados.

La memoria no es mas que un medio de almacenamiento capaz de "recordar" una serie de


datos, lo común es que los datos almacenados en una memoria sean datos binarios, es
decir, una serie de '1' y '0's que representan algo. Sin embargo, conocer el contenido de la

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 52


11ª Olimpiada Mexicana de Informática 2006.
memoria, sirve de muy poco si no sabes de antemano lo que los datos representan. Por
ejemplo, la cadena binaria

0110111101101100011010010110110101110000011010010110000101100100

seguramente no te dice mucho, sin embargo si te indican que cada 8 dígitos binarios
representan un caracter ASCII, entonces podrías darte cuenta de que la cadena anterior
representa la palabra
olimpiad
o si supieras que la cadena binaria representa números enteros , dependiendo del tamaño de
los números enteros, la cadena representaría
Bytes (8 dígitos por entero): 111, 108, 105, 109, 112, 105, 97, 100
Entero corto (16 dígitos): 27759, 28009, 26992, 25697
Entero largo (32 dígitos): 1835625583, 1684105584
Entero cuádruple (64 dígitos): 7016998964367026544

la misma cadena también representa


Flotante (32 dígitos): 4.5150685 e+27, 1.663246 e+22
Double (64 dígitos): 3.4451882 e+175
Fecha DOS (16 dígitos): 15-03-2034
Hora DOS (16 dígitos): 13:35:30

y dependiendo de lo que se haya preestablecido, la misma cadena puede representar miles


de datos diferentes.

Todos los ejemplos anteriores (enteros, flotantes, cadenas de caracteres, fechas, etc) se
conocen como Tipos de Dato, además de los tipos de dato, existen las Estructuras de Datos.
Las Estructuras de Datos sirven para organizar un conjunto de datos, pero a diferencia de los
Tipos de Dato, las Estructuras de Datos no son un objeto pasivo, ya que una Estructura de
Datos es un objeto que puede realizar una serie de operaciones sobre el conjunto de datos,
en general estas operaciones son insertar, remover, acceder, buscar, etc.

Existe una gran cantidad de estructuras de datos, cada una es útil para diferente tipo de
aplicaciones. Su estudio es muy importante, ya que el uso correcto de las estructuras de
datos adecuadas al problema que quieran resolver, puede facilitarles de manera increíble la
codificación, o puede mejorar el desempeño de su programa drásticamente.

3.1. PILAS

La PILA es quizá la estructura de datos común con un acceso más restrictivo, y sin embargo
es quizá también la más usada en el funcionamiento diario de cualquier programa de
cómputo.

La PILA cuenta únicamente con dos operaciones básicas: se puede insertar un dato al inicio
de la pila, y se puede remover un dato del inicio de la pila.

La pila, como puede inferirse, deriva su nombre de que los datos se apilan uno sobre otro,
ocasionando que en cualquier momento únicamente se tenga acceso al dato superior de la

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 53


11ª Olimpiada Mexicana de Informática 2006.
pila. La pila funciona como si hicieran una pila de cajas de refrescos, cuando llega una
nueva caja, la ponen hasta arriba de la pila, ya que sería mucho trabajo levantar todas las
cajas para poder meterla nueva caja hasta abajo. Cuando se necesita un refresco se retira
de la caja superior, si esta se vacía, entonces se remueve y se prosigue con la siguiente
caja. Como se habrán dado cuenta, existe la posibilidad de que una caja de refrescos quede
olvidada en la parte inferior de la pila y se eche a perder. ¡Sin embargo, un taquero con éxito,
debe ser capaz de terminar con toda la pila sin que ningún refresco se le eche a perder!

A las pilas se les conoce en la literatura como estructuras LIFO por sus siglas en inglés (Last
In - First Out), que quiere decir, que el último que entro es el primero que sale. De ahí el
consabido dicho de "Los últimos serán los primeros".

Las pilas tienen un campo de aplicación muy grande en los programas, el más común es la
recursividad, aunque tal vez no lo notaron, ya que el compilador lo hace por ustedes, para
poder implementar cualquier rutina recursiva es necesario contar con una pila. En la sección
de ejercicios se revisarán aplicaciones de una pila para implementar recursión y para analizar
una sentencia.

Una buena implementación de pila debe de tomar en cuenta dos puntos. El primero es que
no debe permitir el remover un dato cuando la pila esta vacía, y el segundo es que no debe
permitir que se inserten datos a la pila si esta ya esta llena.
A continuación se muestra la implementación de una pila en C y en Pascal utilizando
memoria estática.

Pascal C
program Pila; #include<stdio.h>;

const #define MAXPILA 100; (* TAMAÑO MAXIMO


MAXPILA : 100; // TAMAÑO MAXIMO DE DE LA PILA *)
LA PILA
int MemPila[MAXPILA + 1];
var int SP; // ESTA VARIABLE NOS SERVIRA
MemPila : array[0..MAXPILA] of integer; PARA
SP : integer; // ESTA VARIABLE NOS // SABER CUAL ES EL ELEMENTO
SERVIRA PARA SUPERIOR
// SABER CUAL ES EL // DE LA PILA
ELEMENTO SUPERIOR
// DE LA PILA void Insertar(int dato)
{
procedure Insertar(dato : integer); (* LA VARIABLE SP, APUNTA A LA
begin PRIMERA POSICION
// LA VARIABLE SP, APUNTA A LA VACIA DE LA PILA *)
PRIMERA POSICION MemPila[SP++]=dato;
// VACIA DE LA PILA. if (SP > MAXPILA){
MemPila[SP]:=dato; (* AQUI VA UN ERROR INDICANDO
Inc(SP); QUE SE SOBREPASO
if SP > MAXPILA then begin EL LIMITE DE LA PILA *)

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 54


11ª Olimpiada Mexicana de Informática 2006.

// AQUI VA UN ERROR INDICANDO QUE }


SE SOBREPASO }
// EL LIMITE DE LA PILA.
end; int Remover(void)
end; {
(* DECREMENTA EL INDICE DE LA PILA
function Remover : integer; *)
begin if (--SP > 0) then {
Dec(SP); // DECREMENTA EL INDICE DE return(MemPila[SP]);
LA PILA }
if SP > 0 then begin else {
Remover:=MemPila[SP]; (* AQUI VA UN ERROR INDICANDO
end QUE LA PILA ESTA
else begin VACIA Y NO SE PUEDE REMOVER
// AQUI VA UN ERROR INDICANDO QUE NINGUN DATO *)
LA PILA ESTA }
// VACIA Y NO SE PUEDE REMOVER }
NINGUN DATO int main(void) {
end; SP=0; (* INICIALIZA EL INDICE DE LA
end; PILA
AQ UI DEBEN DE PONER SU CODIGO
begin PARA USAR LA PILA *)
SP:=0; // INICIALIZA EL INDICE DE LA }
PILA
// AQUI DEBEN DE PONER SU CODIGO
PARA USAR LA PILA
end.

3.2. COLAS

Las COLAS, al igual que las pilas, son una estructura de datos de acceso restrictivo. Al igual
que en una pila únicamente se cuenta con 2 operaciones, la operación insertar y la
operación remover.

La diferencia entre una cola y una pila es que en la cola (como en una cola para comprar
boletos), el primero que llegó es al primero que se atiende, es decir, una cola tiene un inicio y
un final, los nuevos elementos que llegan se agregan al final de la cola, cuando se remueve
un elemento, se remueve del inicio de la misma.

A las colas se les conoce como estructuras FIFO (First In - First Out), que quiere decir que el
primero que entra, es el primero que sale.

Existe una implementación muy común de la cola que se conoce como cola circular, esta
implementación aprovecha el espacio en memoria de la computadora de la siguiente forma:
inicialmente aparta un espacio para la cola, conforme llegan los elementos los va agregando
al final, cuando remueve un elemento lo hace del inicio de la cola, una vez que ha terminado
con el espacio de memoria que había apartado, revisa si ya se liberó el espacio al inicio de la

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 55


11ª Olimpiada Mexicana de Informática 2006.
cola y "da la vuelta" para aprovechar el espacio al máximo, la implementacion que se
presenta a continuación es la de una cola circular.

Al igual que en la pila, en la cola es muy importante revisar si todavía hay espacio para
seguir guardando elementos, o si la cola esta vacía.

Pascal C
program Cola; #include<stdio.h>;

const #define MAXCOLA 100; (* TAMAÑO MAXIMO


MAXCOLA : 100; // TAMAÑO MAXIMO DE DE LA COLA *)
LA COLA
int MemCola[MAXCOLA + 1];
var int Inicio; (* INICIO DE LA COLA *)
MemCola : array[0..MAXCOLA] of integer; int Fin; (* FIN DE LA COLA *)
Inicio : integer; // INICIO DE LA COLA
Fin : integer; // FIN DE LA COLA void Insertar(int dato)
{
procedure Insertar(dato : integer); (* LA VARIABLE FIN, APUNTA A LA
begin PRIMERA POSICION
// LA VARIABLE FIN, APUNTA A LA VACIA DE LA COLA *)
PRIMERA POSICION MemCola[Fin++]=dato;
// VACIA DE LA COLA. if (Fin > MAXCOLA) {
MemCola[Fin]:=dato; (* SI YA SE LLENO TODA LA MEMORIA
Inc(Fin); HAY QUE
if Fin > MAXCOLA then begin DAR LA VUELTA *)
// SI YA SE LLENO TODA LA MEMORIA Fin=0;
HAY QUE }
// DAR LA VUELTA if (Inicio == Fin) {
Fin:=0; (* SI EL FIN ALCANZO AL INICIO,
end; QUIERE DECIR QUE
if Inicio = Fin then begin DIO TODA LA VUELTA Y YA NO HAY
// SI EL FIN ALCANZO AL INICIO, ESPACIOS
QUIERE DECIR QUE LIBRES, POR LO QUE HAY QUE
// DIO TODA LA VUELTA Y YA NO HAY MARCAR UN ERROR
ESPACIOS DE QUE LA COLA ESTA LLENA *)
// LIBRES, POR LO QUE HAY QUE }
MARCAR UN ERROR }
// DE QUE LA COLA ESTA LLENA
end; int Remover(void)
end; {
if (Inicio == Fin) {
function Remover : integer; (* EL INICIO ES IGUAL AL FIN, QUIERE
begin DECIR QUE
if Inicio = Fin then begin NO HAY DATOS EN LA COLA, POR LO
// EL INICIO ES IGUAL AL FIN, QUIERE TANTO
DECIR QUE MANDA UN ERROR DE COLA VACIA *)

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 56


11ª Olimpiada Mexicana de Informática 2006.

// NO HAY DATOS EN LA COLA, POR LO }


TANTO else {
// MANDA UN ERROR DE COLA VACIA Remover=MemCola[Inicio++]; (*EL DATO
end A DEVOLVER
else begin ES EL QUE ESTA AL INICIO DE LA
Remover:=MemCola[Inicio]; // EL DATO A COLA *)
DEVOLVER (* MUEVE EL INICIO DE LA COLA *)
// ES EL QUE ESTA AL INICIO DE if (Inicio > MAXCOLA) {
LA COLA (* SI LLEGO AL FINAL, DA LA VUELTA
Inc(Inicio); // MUEVE EL INICIO DE LA *)
COLA Inicio=0;
if Inicio > MAXCOLA then begin }
// SI LLEGO AL FINAL, DA LA VUELTA }
Inicio:=0; }
end
end; int main(void){
end; Inicio=0; (* INICIALIZA EL INICIO DE LA
COLA *)
begin Fin=0; (* INICIALIZA EL FINAL DE LA
Inicio:=0; // INICIALIZA EL INICIO DE LA COLA *)
COLA (* AQUI DEBEN DE PONER SU CODIGO
Fin:=0; // INICIALIZA EL FINAL DE LA PARA USAR LA COLA*)
COLA }
// AQUI DEBEN DE PONER SU CODIGO
PARA USAR LA COLA
end.

Fase 3: Resolviendo Problemas con un Lenguaje de Programación 57

Вам также может понравиться