Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: deifk en 8 Noviembre 2011, 16:04 pm



Título: Problema del viajante
Publicado por: deifk en 8 Noviembre 2011, 16:04 pm
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);
}


Título: Re: Problema del viajante
Publicado por: adastra en 8 Noviembre 2011, 16:14 pm
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.


Título: Re: Problema del viajante
Publicado por: deifk en 8 Noviembre 2011, 16:31 pm
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