Расположение n объектов (перестановка с дубликатами) - PullRequest
1 голос
/ 29 сентября 2010

Я ищу быструю реализацию алгоритма "компоновки" (перестановка с дубликатами). Учитывая N объектов (A в количестве a, B в количестве b, ...), сгенерируйте все возможные комбинации.
Пример:

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, если это возможно)

Заранее спасибо
Philippe

1 Ответ

6 голосов
/ 29 сентября 2010

Если вы можете использовать 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;
}

Редактировать: вывод этого: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 ++ несколько лет назад, что может оказаться полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...