2010-09-29 63 views
1

我正在寻找“排列”算法的快速实现(带有重复项的排列)。 给定N个对象(A的数量为a,B的数量为b,...),生成所有可能的组合。
例:n个对象的排列(带有重复项的排列)

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" 

(代码在C,C#或Pascal如果可能的话)

感谢
菲利普

+0

[给定数字集合的排列]可能的重复(http://stackoverflow.com/questions/1653500/permutations-of-a-given-set-of-numbers) - 还有其他几个相关的问题 – 2010-09-29 16:13:45

+0

当所有对象不同时,此函数可用。 – PhilippeC 2010-09-29 16:27:58

回答

6

如果你可以使用C++,它已经在标准库中提供的推进:

#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; 
} 

编辑:从这个输出是:

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

对于任何人谁不能使用C++,马克·尼尔森在C/C++用户杂志几年前写的article,可能是很有帮助。

+0

不幸的是,我不能使用C++库... – PhilippeC 2010-09-29 16:28:28

+0

@PhilippeC:也许我已经添加到答案的链接将有所帮助。 – 2010-09-29 16:35:33

+0

嗨杰里:谢谢你的链接。我在我的工具中有这个功能,但从来没有意识到它与重复工作... – PhilippeC 2010-09-30 07:18:18