2010-09-29 7 views
1

Je cherche une implémentation rapide de l'algorithme "arrangement" (permutation avec doublons). En prenant N objets (A en quantité a, B en quantité b, ...), générer toutes les combinaisons possibles.
Exemple:Disposition de n objets (Permutation avec doublons)

Arrangement("AAA", "B", "CC") would return : 
"AAABCC" "AABACC" "AABCAC" "AABCCA" "ABAACC" "ABACAC" "ABACCA" "ABCAAC" 
"ABCACA" "ABCCAA" "BAAACC" "BAACAC" "BAACCA" "BACAAC" "BACACA" "BACCAA" 
"BCAAAC" "BCAACA" "BCACAA" "BCCAAA" "AAACBC" "AACABC" "AACBAC" "AACBCA" 
"ACAABC" "ACABAC" "ACABCA" "ACBAAC" "ACBACA" "ACBCAA" "CAAABC" "CAABAC" 
"CAABCA" "CABAAC" "CABACA" "CABCAA" "CBAAAC" "CBAACA" "CBACAA" "CBCAAA" 
"AAACCB" "AACACB" "AACCAB" "AACCBA" "ACAACB" "ACACAB" "ACACBA" "ACCAAB" 
"ACCABA" "ACCBAA" "CAAACB" "CAACAB" "CAACBA" "CACAAB" "CACABA" "CACBAA" 
"CCAAAB" "CCAABA" "CCABAA" "CCBAAA" 

(code en C, C# ou Pascal, si possible)

Merci à l'avance
Philippe

+0

duplication possible de [Permutations d'un ensemble de nombres donné] (http://stackoverflow.com/questions/1653500/permutations-of-a-given-set-of-numbers) - il y a aussi plusieurs autres questions connexes –

+0

Cette fonction fonctionne lorsque tous les objets sont différents. – PhilippeC

Répondre

6

Si vous pouvez utiliser C++, il est déjà prévu dans la bibliothèque standard:

#include <algorithm> 
#include <string> 
#include <iostream> 

int main() { 
    std::string a("AAABCC"); 

    do { 
     std::cout << a << "\t"; 
    } while (std::next_permutation(a.begin(), a.end())); 
    return 0; 
} 

Edit: le signal de sortie est constitué par:

AaAbCc AAACBC AAACCB AABACC AABCAC AABCCA AACABC AACACB AACBAC AACBCA AACCAB AACCBA ABAACC ABACAC Abacca ABCAAC ABCACA ABCCAA ACAABC ACAACB ACABAC ACABCA ACACAB ACACBA ACBAAC ACBACA ACBCAA ACCAAB ACCABA ACCBAA BAAACC BAACAC BAACCA BACAAC BACACA BACCAA BCAAAC BCAACA BCACAA BCCAAA CAAABC CAAACB CAABAC CAABCA CAACAB CAACBA CABAAC Cabaca CABCAA CACAAB CACABA CACBAA CBAAAC CBAACA CBACAA CBCAAA CCAAAB CCAABA CCABAA CCBAAA

Pour tous ceux qui ne peuvent pas utiliser C++, Mark Nelson a écrit un article dans le Journal du C/C++ utilisateur il y a quelques années qui pourrait être utile.

+0

Malheureusement, je ne peux pas utiliser la bibliothèque C++ ... – PhilippeC

+0

@PhilippeC: peut-être que le lien que j'ai ajouté à la réponse sera utile. –

+0

Salut Jerry: merci pour le lien. J'ai eu cette fonction dans mes outils mais je n'ai jamais réalisé que ça fonctionnait avec des doublons ... – PhilippeC