#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#ifdef _WIN32 //
#define LIMPIAR_PANTALLA system("cls");
#else
#define LIMPIAR_PANTALLA system("clear");
#endif
/*Definiciones de estructuras*/
typedef struct
{
int G[20][20];
int num_ciudades;
}
Datos;
/*Prototipos de funciones */
int RutaOptima
(void);
void PedirCaminos
(Datos *);
void BuscarRutaOptima
int BuscarEnFila
void GuardarCiudad
void GuardarValor
int SumarTrayectorias
void RepetirPrograma
(void);
void Flush_in
/*Funcion principal*/
int main()
{
RutaOptima();
return 0;
}
/*Funciones hechas por mi*/
int RutaOptima(void)
{
int ruta[20][2]= {0};
Datos datos = {0,0};
do
{
LIMPIAR_PANTALLA
printf("\n\n\n\tTeclee el numero de ciudades a visitar (5 - 20): ");
scanf("%d",&datos.num_ciudades);
Flush_in();
if (datos.num_ciudades < 5 || datos.num_ciudades > 20)
{
printf("\n\n\t\t** El numero de ciudades tiene que estar entre 5 y 20 **");
getchar();//sirve para capturar un caracter0''
}
}
while (datos.num_ciudades < 5 || datos.num_ciudades > 20);
PedirCaminos(&datos);
BuscarRutaOptima(&datos, ruta);
ImprimirRutaOptima(ruta, datos.num_ciudades);
RepetirPrograma();
return 0;
}
{
printf("\n\t\t** La ciudad debe estar entre 1 y %d **", datos ->
num_ciudades);
getchar();
}
}
while(inicio < 1 || inicio > (datos -> num_ciudades));
r[0][0] = inicio;
inicio--;
for (i = 0; i < (datos -> num_ciudades); i++)
{
if(i == 0)
{
indice_del_menor = BuscarEnFila(datos, inicio, r);
QuitarCiudadesVisitadas(datos, r, indice_del_menor, false);
}
else
{
if (i == (datos -> num_ciudades) - 2)
{
indice_del_menor = BuscarEnFila(datos, indice_del_menor, r);
QuitarCiudadesVisitadas(datos, r, indice_del_menor, true);
}
else
{
indice_del_menor = BuscarEnFila(datos, indice_del_menor, r);
QuitarCiudadesVisitadas(datos, r, indice_del_menor, false);
}
}
}
}
int BuscarEnFila(Datos *datos, int inicio, int r[20][2])
{
int j, menor = 999999, indice_del_menor;
for (j = 0; j < (datos -> num_ciudades); j++)
{
if ( (datos -> G[inicio][j]) != 0 )
{
if ( (datos -> G[inicio][j]) < menor )
{
menor =
indice_del_menor = j;
}
}
}
GuardarCiudad(r ,indice_del_menor);
GuardarValor(r, menor);
return indice_del_menor;
}
void GuardarCiudad(int r[20][2] , int indice_del_menor)
{
int i, num_ciudades_visitadas;
i= 0;
num_ciudades_visitadas = 0;
while(r[i][0] != 0)
{
i++;
num_ciudades_visitadas++;
}
r[num_ciudades_visitadas][0] = indice_del_menor + 1;
}
void GuardarValor(int r[20][2], int menor)
{
int i, num_ciudades_visitadas;
i=0;
num_ciudades_visitadas = 0;
while(r[i][1] != 0)
{
i++;
num_ciudades_visitadas ++;
}
r[num_ciudades_visitadas][1] = menor;
}
void QuitarCiudadesVisitadas(Datos *datos, int r[20][2], int indice_del_menor, bool
penultimo)
{
int i, num_ciudades_visitadas, aux;
i = 0;
num_ciudades_visitadas = 0;
while(r[i][1] != 0)
{
i++;
num_ciudades_visitadas++;
}
if (penultimo == true)
{
for (i = num_ciudades_visitadas; i >= 1; i--)
{
aux = r[i][0];
aux = aux - 1;
datos -> G[indice_del_menor][aux] = 0;
}
}
else
{
for (i = num_ciudades_visitadas; i >= 0; i--)
{
aux = r[i][0];
aux = aux - 1;
datos -> G[indice_del_menor][aux] = 0;
}
}
}
void ImprimirRutaOptima(int ruta[20][2], int n)
{
int i, total;
total = SumarTrayectorias(ruta, n);
printf("\n\n\tUna ruta optima seria: ");
for (i = 0; i < n + 1; i++)
{
if (i == n)
printf(" %d\n", ruta[i][0]);
else
printf(" %d ->", ruta[i][0]);
}
printf("\n\n\tTotal de kilometros recorridos:");
if (i == n-1)
printf(" %d = %d\n\n", ruta[i][1],total);
else
printf(" %d +", ruta[i][1]);
}
getchar();
}
int SumarTrayectorias(int r[20][2], int n)
{
int i, total=0;
for (i = 0; i < n; i++)
total += r[i][1];
return total;
}
void RepetirPrograma(void){
int opcion;
do
{
LIMPIAR_PANTALLA
printf("\n\n\t\tDesea repetir de nuevo el programa\n\n\t 1.Si\n\n\t 2.No");
printf("\n\n\n\tElegir opcion: ");
scanf("%d", &opcion);
Flush_in();
switch(opcion)
{
case 1:
RutaOptima();
break;
case 2:
LIMPIAR_PANTALLA
break;
default:
printf("\n\n\tOpcion no valida");
getchar();
break;
}
}
while (opcion < 1 || opcion > 2);
}
void Flush_in (void)
{
char caracter;