Search code examples
c++algorithmpermutation

Permutation algorithm C++


I try to translate an algorithm that generates all permutations of k out of n in C++ :

public void calculerEquipeTOT(ArrayList<Nageur> L, ArrayList<Nageur> F, int k) {

    if (k == 0) {
        if (calculerPointsTOT(L) > this.pointsMeilleureEquipe){
            this.meilleureEquipe = L;
            this.pointsMeilleureEquipe = calculerPointsTOT(meilleureEquipe);
        }
    } else {
        for (Nageur x : F) {
            ArrayList<Nageur> G = new ArrayList<Nageur>(F);
            G.remove(G.indexOf(x));
            ArrayList<Nageur> L2 = new ArrayList<Nageur>(L);
            L2.add(x);
            calculerEquipeTOT(L2, G, k - 1);
        }
    }
}

My problem is that the Lists could be Objects list and I don't know how to remove the x of the L2 list... I am not a C++ specialist, I managed it in Java but I have to do it in C++.


Solution

  • I have transliterated your function and I have gotten the following

    #include <iostream>
    #include <list>
    #include <iterator>
    
    void arrangements( std::list<char> l, std::list<char> f, size_t k ) 
    {
        if ( k == 0 ) 
        {
            for ( char c : l ) std::cout << c << ' ';
            std::cout << std::endl;
        } 
        else 
        {
            for ( auto it = f.begin(); it != f.end(); ++it )
            {
                std::list<char> g( f.begin(), it );
                g.insert( g.end(), std::next( it ), f.end() );
    
                std::list<char> l2( l );
                l2.push_back( *it );
    
                arrangements( l2, g , k-1 );
            }
        }
    }
    
    int main()
    {
        std::list<char> f = { 'A', 'B', 'C', 'D' };
    
        arrangements( std::list<char>(), f, 2 );
    }
    

    The program output is

    A B 
    A C 
    A D 
    B A 
    B C 
    B D 
    C A 
    C B 
    C D 
    D A 
    D B 
    D C 
    

    I do not know whether it is what you want to get.

    If to call the function with k equal to 3 then the program output will be

    A B C 
    A B D 
    A C B 
    A C D 
    A D B 
    A D C 
    B A C 
    B A D 
    B C A 
    B C D 
    B D A 
    B D C 
    C A B 
    C A D 
    C B A 
    C B D 
    C D A 
    C D B 
    D A B 
    D A C 
    D B A 
    D B C 
    D C A 
    D C B