C++での繰り返しを伴うすべての順列の生成方法


以下にいくつかの方法を示します。

  1. 再帰を使用した方法: 再帰を使用して繰り返しを伴う順列を生成する方法は次のようになります。
#include <iostream>
#include <vector>
using namespace std;
void generatePermutations(vector<int>& elements, vector<int>& permutation, int length) {
    if (length == permutation.size()) {
        for (int num : permutation) {
            cout << num << " ";
        }
        cout << endl;
        return;
    }
    for (int i = 0; i < elements.size(); i++) {
        permutation.push_back(elements[i]);
        generatePermutations(elements, permutation, length);
        permutation.pop_back();
    }
}
int main() {
    vector<int> elements = {1, 2, 3};
    int length = 3;
    vector<int> permutation;
    generatePermutations(elements, permutation, length);
    return 0;
}

このコードは、elementsベクターから長さlengthの繰り返しを伴う順列を生成します。再帰関数generatePermutationsは、順列の要素を再帰的に組み合わせ、生成します。

  1. ライブラリを使用した方法: C++のSTL(Standard Template Library)には、順列を生成するためのアルゴリズムが用意されています。next_permutation関数を使用することで、簡単に繰り返しを伴う順列を生成することができます。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
    vector<int> elements = {1, 2, 3};
    sort(elements.begin(), elements.end());
    do {
        for (int num : elements) {
            cout << num << " ";
        }
        cout << endl;
    } while (next_permutation(elements.begin(), elements.end()));
    return 0;
}

このコードでは、next_permutation関数を使用して順列を生成します。elementsベクターを事前に昇順にソートしてから、do-whileループを使用して順列を生成し、出力します。

これらの方法を使って繰り返しを伴う順列を生成することができます。適宜、要素の集合や長さを変更して試してみてください。