CloudStrife hat geschrieben:Nur dass ich dich richtig verstehe Xin,
wenn ich einfach von 1 auf 44 Bit hochzähle, dann habe ich ja jede menge doppelte Werte?
Villeicht habe ich mich auch nicht klar ausgedrückt bei meiner Problembeschreibung, deshalb jetzt mal ein Bsp.:
var1 = 0 var2 = 1 var3 = 2
var4 = 3 var5 = 4 var6 = 5
var7 = 6 var8 = 7 var9 = 8
var10 = 9 var11 = 10
Ah... okay, da hast Du natürlich recht, da habe ich Dich Mistverstanden. ^^
Okay... dann hast Du ein Backtracking-Problem, das ich wie folgt lösen würde. Erstmal pack Deine Variablen in ein Array.
Code: Alles auswählen
int main( void )
{
int variables[11];
backTracking( variables, 0 );
return 0;
}
Anschließend schreibst Du eine rekursive Funktion: (ich schreibe die jetzt mal einfach so... heißt ungetestet...)
Code: Alles auswählen
void doSomethingWithCombination( int * variables )
{
printf( "Kombination: " );
for( int i = 0; i < 11; i++ )
printf( "%d; ", variables[i];
printf( "\n" );
}
bool contains( int * variables, int position, int value )
{
for( int i = 0; i < position; i++ )
if( variables[i] == value )
return false;
return true;
}
void backTracking( int * variables, int position )
{
for( int i = 0; i <= 15; i++ )
if( !contains( variables, position, i )
{
/* Mögliche Kombination für position gefunden */
variables[ position ] = i;
if( position == 10 )
doSomethingWithCombination( variables ); // alle Variablen gesetzt -> Testen
else
backTracking( variables, position + 1 ); // nächste Variable setzen
}
}
So, das ist nur flott hingeklatscht, also gehe ich mal davon aus, dass das hier nichtmals kompiliert.
Was passiert: Er geht alle Möglichkeiten durch, gibt also der ersten Variable eine 1. Wenn er an Position 10 (also 11. Variable) ist, passiert die Action - ist er aber nicht, also ruft er sich Rekursiv für Position 1 (2. Variable) auf und guckt dann, was er der zweiten Variable für eine Zahl geben kann. Er probiert die 1 und stellt über contains() fest, dass die Zahl bereits im Array ist. Also geht er in der Schleife weiter: 2? Passt. So hangelt er sich runter.
Nachdem er die für die 2. Variable nun durchgetestet hat, steckt er immernoch in der Schleife. Also probiert er als nächstes die 3. Vorher gibt es weiterhin nur die 1 im Array. Die drei passt also... und so geht er wieder weiter runter für die 3, 4...9, 10, 11 Variable.
Wann immer er Index 10 gesetzt hat und ruft er die Funktion doSomething...() auf, so dass Du damit Deinen Test fahren kannst.
Das Paradebeispiel zum Backtracking hier ist das
Damenproblem.