2010-09-29 37 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