Asuntos Oficiales > Retos
El Problema De Los Bloques
Nagisa:
Hola MutenRo. siento contestar tan tarde. Los huecos si que se pueden rellenar. De hecho, cada vez que se dice que un bloque vuelve a su posicion inicial es a eso a lo que se refiere.
Sobre la posibilidad de volver a la posicion inicial... es imposible. Para devolver un bloque a su sitio, debes de apilar otro en la pila que lo contenia: asi que en el mejor de los casos tendras n-1 pilas de un bloque y una de dos.
Si bien como has podido observar, una vez llegues a una unica pila el resto de ordenes son ilicitas.
Deje bastante claro que la entrada era la entrada standrd (TECLADO!!!)
Ademas, aunque no lo he probado, creo que tu programa daria algun tipo de error al leer el comando quit, ya que no va seguido de nada mas(y tu lees dos cadenas y dos numeros).
Tampoco he dicho en ningun sitio que cada elemento sintactico este separado por un unico espacio; caso en el que tambien fallaria tu codigo.
De todos modos, a mi no me funciona en mi ordenador. Ya lo revisare.
Un saludo!!
MutenRo:
Hola Nagisa,
lo de la entrada estándar se me pasó (lo comentas al final del e-mail y yo me concentré en el recuadro del enunciado donde no se menciona nada al respecto).
Por lo demás a mi me funciona perfectamente y con las intrucciones del ejemplo se obtiene la salida esperada.
Yo utilizo el Visual C++ tanto para C como para C++ y tal vez haya escrito algo que no sea estrictamente de C (por ejemplo los comentarios de una línea con //).
Trata de compilarlo en C++.
El programa lee las intrucciones con un fscanf y comprueba si ha asignado las cuatro variables que se leen en cada línea (todas tienen 4). Sale del programa cuando no se han asignado las cuatro variables (escribas quit o cualquier otra cosa).
Y lo de presuponer un solo espacio pues creo que es lógico dado que en el ejemplo vienen así todos los comandos...
Un saludo.
carlos20:
:angry: :angry: :angry:
Nagisa:
Hola MutenRo!! Lo he probado bajo Linux y si que funciona :) , asi que supongo que sera algun tipo de problema con Windows :angry: . Me falla a la hora de abrir el fichero de ordenes :(
De todos modos, la solucion al problema, a pesar de ser correcta, no es buena. Desperdicias demasiada memoria y pierdes demasiado tiempo.
En concreto, en el ejemplo dado, tu reservas 25 x 25 = 625 posiciones de memoria, cuando se puede hacer con bastantes menos. En general lo hago con (2n + 1) + 1 puntero; con lo que son 21 + 1p para n = 10.
En cuanto al tiempo... Se podria buscar una forma de saber mas rapido en que pila esta un bloque sin recorrerlas todas. En el peor de los casos, tu consultas n posiciones de memoria (es justo el ultimo de la ultima pila)... Mi solucion lo hace consultando solo una.
Normalmente en los concursos de programacion te suelen limitar tanto el tiempo que permiten que ejecute tu programa como la memoria que le dejan usar.
Si tienes tiempo y/o ganas intenta mejorarlo :lightsabre: . La solucion para una pequeña mejora: memoria dinamica y variables redundantes. La solucion para una mejor mejora: darle muchas vueltas a la solucion anterior :lol:
Salu2!!
Nagisa:
Carlos20... Tu programa da fallos en la salida. Te explico: la solucion obtenida es correcta, pero se te pide que la salida siga un formato muy especifico.
--- Citar ---LA SALIDA:
La salida debera de consistir en el estado final del mundo de bloques. Cada posicion inicial del bloque i ( 0 <= i < n, donde n es el numero de bloques) debera aparecer seguida inmediatmente por dos puntos (':'). Si hay al menos un bloque en ella, los dos puntos deberan de estar seguidos por un espacio, seguido de la lista de bloques que estan apilados en esa posicion con cada numero de bloque separado del resto por un espacio. No poner espacios sobrantes al final de la linea.
--- Fin de la cita ---
Tu salida (pongo '|' al final de cada linea):
--- Código: Text ---0 : 0 |1 : 1 9 2 4 |2 : |3 : 3 |4 : |5 : 5 8 7 6 |6 : |7 : |8 : |9 : |
Sobre el codigo... esta en C++, y no se porgramar :( , aunque se entiende bastante bien :lol: De todas formas, echandole un vistazo me parece que haces lo mismo que MutenRo. Usas pilas acotadas reservando en tiempo de compilacion el tamaño máximo, y haces busquedas exhaustivas de los bloques. Considero ambas soluciones correctas, pero no válidas.
¿¿Por que os da tanto miedo la memoria dinámica?? :scream:
Lo mismo que le dije a MutenRo. Suerte B)
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa