elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 02:56  


Tema destacado: Suscripción al boletín mensual de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Problema del viajante
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema del viajante  (Leído 818 veces)
deifk

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Problema del viajante
« en: 8 Noviembre 2011, 16:04 »

Hola! por primera vez escribo en este foro para pedir ayuda sobre un programa que han mandado en clase, el problema del viajante. Para hacerlo solo dispongo de las herramientas, if-else y switch, ya que no hemos dado mas haya este año, se me ocurre formas de hacer el programa con el for y un vector, pero eso no lo puedo utilizar, asi que haber si me podeis ayudar y decirme el porque mi programa no se ejecuta correctamente.
El problema que se plantea es el siguiente, dispongo de un punto inicial, y digamos otros 3 posibles puntos, con sus respectivas coordenadas, los cuales son introducidos por el usuario. Pues bien el objetivo es que el programa saque por pantalla, el recorrido minimo (en distancia) y el numero de recorrido, para ello utilizo las variables x e y, las cuales las inicializo y supongo que la distancia t123 es la minima.

/*Problema del viajante, calculo de la distancia minima*/

#include <stdio.h>
#include <math.h>

main()
 
{
 float x1,y1,x2,y2,x3,y3,d01,d02,d03,d12,d13,d23,d10,d20,d30,d21,d31,d32,t123,t132,t213,t231,t312,t321,x,y;
 
 printf("Introduzca las coordenadas del punto 1: ");
 scanf("%f%f", &x1, &y1);
 printf("Introduzca las coordenadas del punto 2: ");
 scanf("%f%f", &x2, &y2);
 printf("Introduzca las coordenadas del punto 3: ");
 scanf("%f%f", &x3, &y3);
 
 d01=d10=sqrt(x1*x1+y1*y1);
 d02=d20=sqrt(x2*x2+y2*y2);
 d03=d30=sqrt(x3*x3+y3*y3);
 d12=d21=sqrt((pow((x2-x1),2))+(pow((y2-y1),2)));
 d13=d31=sqrt((pow((x3-x1),2))+(pow((y3-y1),2)));
 d23=d32=sqrt((pow((x3-x2),2))+(pow((y3-y2),2)));
 
 t123=d01+d12+d23+d30;
 t132=d01+d13+d32+d20;
 t213=d02+d21+d13+d30;
 t231=d02+d23+d31+d10;
 t312=d03+d31+d12+d20;
 t321=d03+d32+d21+d10;

 x=t123;
 y=123;
 
 if(t213<t123 && t213<t132 && t213<t231 && t213<t312 && t213<t321)
   {
    x=t213;
    y=213;
   }
 else if(t132<t123 && t132<t213 && t132<t231 && t132<t312 && t132<t321)
   {
    x=t132;
    y=132;
   }
 else if(t231<t123 && t231<t132 && t231<t213 && t231<t312 && t231<t321)
   {
    x=t231;
    y=231;
   }
 else if(t312<t123 && t312<t132 && t312<t213 && t312<t231 && t312<t321)
   {
    x=t312;
    y=312;
   }
 else if(t321<t123 && t321<t132 && t321<t213 && t321<t231 && t321<t312)
   {
    x=t321;
    y=321;
   }       
           
printf("El identificador de recorrido minimo es 0-%3.0f-0 y la distancia minima %0.4f\n", y,x);
}


En línea
adastra
Endless Learner
Colaborador
***
Desconectado Desconectado

Mensajes: 627


http://thehackerway.com/


Ver Perfil WWW
Re: Problema del viajante
« Respuesta #1 en: 8 Noviembre 2011, 16:14 »

Es normal que tu código se vea desordenado y utilices demasiadas variables (estas aprendiendo) pero para hacer lo que te han pedido sin usar ciclos "for" o otras instrucciones de repetición, debes usar RECURSIVIDAD de funciones, por ejemplo:


void funcion1(int valor) {
  if(valor == 10) {
     return;
  } else {
     valor = valor+1;
     funcion1(valor);
  }
}

El comportamiento anterior es exactamente igual a un ciclo for del 1 al 10. es algo que se usa con frecuencia entre programadores de c/c++/java y suele ser una estupenda forma de realizar tareas con un nivel de complejidad medio/alto.
Lee más sobre este tema y seguramente podras resolver tu problema mucho más facilmente.


En línea

http://twitter.com/jdaanial
http://thehackerway.com/

"Nunca discutas con un idiota, podria no notarse la diferencia"
Kant.
deifk

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: Problema del viajante
« Respuesta #2 en: 8 Noviembre 2011, 16:31 »

Algo de lo que me comentas me suena de haberlo dado hace un par de años, pero creo que no puedo utilizarlo, aun no hemos dado llamadas a funciones nose si eso podre ponerlo, de todas formas leere sobre el tema gracias por contestar tan rapido, si alguien tiene una solucion simple al problema solo con las herramientas que he expuesto y me puede dar alguna pista mas se lo agradeceria.
un saludo
En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines