Reihenfolge austesten



  • Hallo,
    ich habe das Problem alle erdenklichen Reihenfolgen oder Kombinationsmöglichkeiten einer Reihe durchtesten zu müssen.
    Also, sagen wir A, B, C, D, E, F, G, H, I und J.
    1.) A, B, C, D, E, F, G, H, I, J
    2.) B, A, C, D, E, F, G, H, I, J
    3.) usw.

    Mir ist klar, das mit jeder Einheit die dazu kommt, die Möglichkeiten ástronomisch steigen.
    Wer kennt aber einen Algorithmus für dieses Prob.

    Vielen Dank
    Geoffrey



  • [Edit]Nu aber:

    int fakultaet( int count )
    {
    	int result;
    
    	for ( result = 1; count > 1; --count )
    	{
    		result *= count;
    	}
    
    	return ( count < 0 ) ? -1 : result;
    }
    
    void generate( char *array, int count )
    {
    	int i, iter = fakultaet( count );
    
    	for ( i = 0; iter; --iter )
    	{
    		// Ausgeben usw...
    		for ( int j = 0; j < count; ++j )
    		{
    			std::cout << array[ j ] << " ";
    		}
    
    		std::cout << std::endl;
    
    		swap( array[ i ], array[ i+1 ] );
    		i = ( i == count-2 ) ? 0 : i+1;
    	}
    }
    

    grüße



  • Wow...

    hätte nicht gedacht, dass so schnell geantwortet wird.

    Liebe Grüsse
    Geoffrey



  • Oder man macht sich das Leben ganz einfach und verwendet next_permutation 😉

    #include <algorithm>
    #include <iterator>
    #include <iostream>
    
    int main()
    {
        std::string str = "ABCDEFGHIJ";      
        do
        {
            std::copy(str.begin(),str.end(),std::ostream_iterator<char>(std::cout, ", "));
            std::cout << "\n";
        }
        while(std::next_permutation(str.begin(),str.end()));
        return 0;
    }
    


  • evilissimo schrieb:

    Oder man macht sich das Leben ganz einfach und verwendet next_permutation 😉

    #include <algorithm>
    #include <iterator>
    #include <iostream>
    
    int main()
    {
        std::string str = "ABCDEFGHIJ";      
        do
        {
            std::copy(str.begin(),str.end(),std::ostream_iterator<char>(std::cout, ", "));
            std::cout << "\n";
        }
        while(std::next_permutation(str.begin(),str.end()));
        return 0;
    }
    

    Is das nich langweilig? 😉



  • David_pb schrieb:

    Is das nich langweilig? 😉

    😮 Stimmt, hast Recht!

    Dann einfach beide Lösungen verknüpfen.

    1. Mache eine leere Liste
    2. Solange Länge der Liste != Anzahl der Permutationen
    2 a) Bestimme Zufallszahl zuf
    2 b) Rufe zuf mal nextPermutation() auf
    2 c) Wenn nicht in Liste vorhanden: Gib aus und füge in Liste ein


Anmelden zum Antworten