BEE BREEDING (algoritmo del ACM)
alguien podria decirme como resolver (no programar- claro si lo quieren pasa re es bienvenido-), el problema llamado BEE BREEDING?
aqui esta problema:
http://acm.uva.es/p/v8/808.html
supuestamente hay que encotrar el minimo numero de lugares (o rombos) que debes recorrer para lleagr de un lugar a otro. Para ello se debe encontrar un patron para saber que numero sigue despues de cual, por ejemplo, que del 19 sigue el 36 y luego el 59. Se que va aumentando la distancia de 6 en 6, pero es lo unico, ojala alguien me pueda ayudar.
gracias de antemano.
aqui esta problema:
http://acm.uva.es/p/v8/808.html
supuestamente hay que encotrar el minimo numero de lugares (o rombos) que debes recorrer para lleagr de un lugar a otro. Para ello se debe encontrar un patron para saber que numero sigue despues de cual, por ejemplo, que del 19 sigue el 36 y luego el 59. Se que va aumentando la distancia de 6 en 6, pero es lo unico, ojala alguien me pueda ayudar.
gracias de antemano.
Bueno, no es que no haga nada, es que lo hace rápido, y no lo ves...
Parece una broma pero es así. Haz lo siguiente: justo antes de "return 0; " de main(), pón "getchar()", para que el flujo del proceso se detenga hasta que pulses una tecla.
Con respecto a cómo debería funcionar (que no lo debe hacer bien, ya que no pasó el examen): determina la posición de cada celda, con su número y el ángulo que forma un vector que apunta desde la celda "1" (origen de coordenadas). Y después, calcula la distancia entre una celda y otra aplicando el teorema del coseno (ese que usaba en la escuela para resolver "triángulos oblicuángulos").
Y eso era todo. Supongo que este planteo es uno de los peores posibles. Ahora se me ocurre que bien podría hacerse algo similar, pero considerando sólo triángulos rectángulos. O, también, barajar y dar de nuevo.
Alejandro
Parece una broma pero es así. Haz lo siguiente: justo antes de "return 0; " de main(), pón "getchar()", para que el flujo del proceso se detenga hasta que pulses una tecla.
Con respecto a cómo debería funcionar (que no lo debe hacer bien, ya que no pasó el examen): determina la posición de cada celda, con su número y el ángulo que forma un vector que apunta desde la celda "1" (origen de coordenadas). Y después, calcula la distancia entre una celda y otra aplicando el teorema del coseno (ese que usaba en la escuela para resolver "triángulos oblicuángulos").
Y eso era todo. Supongo que este planteo es uno de los peores posibles. Ahora se me ocurre que bien podría hacerse algo similar, pero considerando sólo triángulos rectángulos. O, también, barajar y dar de nuevo.
Alejandro
ya le cambie y sigue igual, que se supone que debo de teclear en el programa para que salga?
por cierto, ya se me ocurrio una solucion y al parecer infalible.
checando desde el 1 todos los lados, sabemos que va avanzando de 6 en 6, asi que solo vas checando hasta encontrar el numero primero, luego con el segundo y buscas sus secuencias y checas en que diagonal se entersectan y ya con eso el numero de espacios es casi autimatico.
por cierto, ya se me ocurrio una solucion y al parecer infalible.
checando desde el 1 todos los lados, sabemos que va avanzando de 6 en 6, asi que solo vas checando hasta encontrar el numero primero, luego con el segundo y buscas sus secuencias y checas en que diagonal se entersectan y ya con eso el numero de espacios es casi autimatico.
Oye, que me estoy poniendo nervioso. Me tomé la molestia y tú ni siquiera leiste las instrucciones.
vé a http://acm.uva.es/p/v8/808.html y lee de qué se trataba.
Me cache
vé a http://acm.uva.es/p/v8/808.html y lee de qué se trataba.
Me cache
como?, no entiendo a que te refieres con que no lei las instrucciones.
me vine a estos foros porque nadie de mis compañeros sabia como resolverlo, mi profe tampoco y yo intente e intente y no sabia como hasta apenas ayer que se me ocurrio.
perdon si es que te ofendi con algo o lo mal interprestaste y gracias por tomarte de molestia de tratar de hacerlo, pero es que no entiendo lo que debo de poner en la entrada de tu programa, el que hiciste, porque pongo por ejemplo 19 30 y no me hace nada o pongo
19
30
y no hace nada, no es que no sepa la entrada de lo que el problema pide.
me vine a estos foros porque nadie de mis compañeros sabia como resolverlo, mi profe tampoco y yo intente e intente y no sabia como hasta apenas ayer que se me ocurrio.
perdon si es que te ofendi con algo o lo mal interprestaste y gracias por tomarte de molestia de tratar de hacerlo, pero es que no entiendo lo que debo de poner en la entrada de tu programa, el que hiciste, porque pongo por ejemplo 19 30 y no me hace nada o pongo
19
30
y no hace nada, no es que no sepa la entrada de lo que el problema pide.
Bueno, es que como ya sabemos, todos los de C++ son unos calentones.
Prueba poniendo:
19 30
0 0
(como dice en las intrucciones, claro), que tal vez sea por que te faltó poner el último par de ceros por lo que el programa no hace nada.
Suerte,
Alejandro
Prueba poniendo:
19 30
0 0
(como dice en las intrucciones, claro), que tal vez sea por que te faltó poner el último par de ceros por lo que el programa no hace nada.
Suerte,
Alejandro
Hola, traté de hacer un programa para intentar resolver el problema,. Creí que estaba, por lo menos, al probarlo con toda una serie de pares de valores, calculaba bien... pero al mandarlo me contestaron que no resuelve el problema. Así que bueno, todo un fracaso.
Por si te interesa, acá abajo escribo mi fracaso:
/**************
solution to problem 808
by: Alejandro Comes
date: 04/23/04
**************/
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
int ciclo(int a);
int cero(int a, int c);
int main()
{
int a = 0;
int b = 0;
double dist;
vector<int> v;
do {
cin >> a;
cin >> b;
v.push_back(a);
v.push_back(b);
} while (a && b);
vector<int>::iterator i = v.begin();
while(i != v.end() ) {
a = *i++;
b = *i++;
if(!a && !b) break;
int c1 = ciclo(a-1);
int n1 = a-cero(a, c1);
double ang1;
if(!c1) ang1 = 0;
else ang1 = (double)n1*60/c1;
int c2 = ciclo(b-1);
int n2 = b-cero(b, c2);
double ang2;
if(!c2) ang2 = 0;
else ang2 = (double)n2*60/c2;
dist = sqrt(c1*c1+c2*c2-2*c1*c2*
cos((ang1-ang2)*3.14/180));
dist = floor(dist+.5);
if(a && b)
cout<< "The distance between cells ";
cout <<a<<" and "<<b<<" is "<<dist<<endl;
}
return 0;
}
int ciclo(int a)
{
if(!a) return 0;
for(int i=1; ; ++i) {
int n= 6*i;
if(a <= n) return i;
a -= n;
}
}
int cero(int a, int c)
{
if(!c) return 1;
int cero = 1;
for(int i=1; i<=c; ++i) {
cero = cero+6*i-5;
}
return cero;
}
Por si te interesa, acá abajo escribo mi fracaso:
/**************
solution to problem 808
by: Alejandro Comes
date: 04/23/04
**************/
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
int ciclo(int a);
int cero(int a, int c);
int main()
{
int a = 0;
int b = 0;
double dist;
vector<int> v;
do {
cin >> a;
cin >> b;
v.push_back(a);
v.push_back(b);
} while (a && b);
vector<int>::iterator i = v.begin();
while(i != v.end() ) {
a = *i++;
b = *i++;
if(!a && !b) break;
int c1 = ciclo(a-1);
int n1 = a-cero(a, c1);
double ang1;
if(!c1) ang1 = 0;
else ang1 = (double)n1*60/c1;
int c2 = ciclo(b-1);
int n2 = b-cero(b, c2);
double ang2;
if(!c2) ang2 = 0;
else ang2 = (double)n2*60/c2;
dist = sqrt(c1*c1+c2*c2-2*c1*c2*
cos((ang1-ang2)*3.14/180));
dist = floor(dist+.5);
if(a && b)
cout<< "The distance between cells ";
cout <<a<<" and "<<b<<" is "<<dist<<endl;
}
return 0;
}
int ciclo(int a)
{
if(!a) return 0;
for(int i=1; ; ++i) {
int n= 6*i;
if(a <= n) return i;
a -= n;
}
}
int cero(int a, int c)
{
if(!c) return 1;
int cero = 1;
for(int i=1; i<=c; ++i) {
cero = cero+6*i-5;
}
return cero;
}
gracias, ya lo compile, pero no hace nada.
como se supone que funciona??? o que debo de poner, no se mucho C (mas bien se java), y hay cosas que no entiendo, pero si me dices cual fue tu logica para resolverlo te lo agradeceria. y tambien que me digas que debo de poner para que haga algo.
gracias.
como se supone que funciona??? o que debo de poner, no se mucho C (mas bien se java), y hay cosas que no entiendo, pero si me dices cual fue tu logica para resolverlo te lo agradeceria. y tambien que me digas que debo de poner para que haga algo.
gracias.
