Y
Das kennt wohl jeder, wenn man den Wald vor lauter Bäumen nicht mehr sieht...
Das Beste ist wohl, die Arbeit immer an anderen Stellen zu erledigen. In dem Fall sind es die Fahrdauern, die direkt berechnet werden können (die Durchschnittsgeschwindigkeit wird anschließend sowieso nicht mehr benötigt) und eben die Permutationsberechnung, die bei der Bestimmung der Gesamtdistanz und Fahrdauer nichts verloren hat.
Der Aufbau würde dann viel klarer sein:
const int KNOTEN=4;
...
int indices[KNOTEN];
// erste Strecke 0 1 2 3
for(int k=0; k<KNOTEN; ++k)
indices[k]=k;
do
{
int distance=0, duration=0;
for(int k=0; k<KNOTEN; ++k)
{
printf("%d ", indices[k]);
if(k)
{
// distance+=Matrix[indices[k-1]][indices[k]]
// duration+=Matrix[indices[k]][indices[k-1]]
}
}
/* Ausgabe Distanz und Dauer*/
putchar('\n');
} while(next_permutation(&indices[0], &indices[KNOTEN]));
Auslagern von Funktionalität ist natürlich auch hinsichtlich der Wiederverwendung super. Leider kennt C keine templates.
void swap(int* i1, int* i2)
{
int t=*i1;
*i1=*i2;
*i2=t;
}
void reverse(int* first, int* last)
{
for( ; first!=last && first!=--last; ++first)
swap(first, last);
}
typedef enum bool_ {false, true} bool;
// Code von HP
bool next_permutation(int* first, int* last)
{
if(first==last)
return false;
int* i=first;
++i;
if(i==last)
return false;
i=last;
--i;
for(;;)
{
int* ii=i--;
if(*i<*ii)
{
int* j=last;
while(!(*i<*--j));
swap(i, j);
reverse(ii, last);
return true;
}
if(i==first)
{
reverse(first, last);
return false;
}
}
}
Edit: Mir fällt gerade noch auf, dass zu dem Startpunkt wohl noch zurückgekehrt werden sollte, aber das lässt sich auch noch leicht einbauen. Am besten, du lagerst alle Berechnungen einfach in einer weiteren Funktion aus.