1

代数のクラスで、ABC と 123 を使用して、3 文字の文字列に対して 216 の異なる順列を作成できることを知っていますよね? (6 x 6 x 6) 上記の例の可能な順列を表示するコンソール プログラムを C++ で作成したいと思います。問題は、どうすればそれらを計算しようとすることさえできるかということです。多分:

AAA BAA CAA 1BA 2BA 3CA 1AB 2BC 3CA

これを尋ねるのは本当に難しいですが、すべての順列を確実に含めるにはどうすればよいでしょうか? 216 あることは知っていますが、実際にそれらすべてを調べる方法がわかりません。

どんな提案でも大歓迎です!!!

4

3 に答える 3

3

再帰を使用すると、非常に簡単に実行できます。6 つの要素すべての配列がある場合、それを行う Java コードを次に示します。C++ に簡単に変換できると確信しています。

void getAllCombinations(List<String> output, char[] chrs, String prefix, int length) {
    if (prefix.length() == length) {
        output.add(prefix);
    } else {
        for (int i = 0;i < chrs.length;i++) {
            getAllCombinations(output, chrs, prefix + chrs[i], length);
        }
    }
    return;
}

これは完全ではありませんが、一般的なアイデアを提供する必要があります。パラメーターを指定して実行します: 空のリスト、使用可能な文字の配列、空の文字列、目的の文字列の長さ。

于 2012-04-09T01:24:29.323 に答える
3

固定数の文字列が必要な場合は、Nネストされたループ (この場合は 3 つ) を使用できます。

string parts = "ABC123";
for (int i = 0 ; i != parts.size() ; i++)
    for (int j = 0 ; j != parts.size() ; j++)
        for (int k = 0 ; k != parts.size() ; k++)
            cout << parts[i] << parts[j] << parts[k] << endl;

が修正されていない場合Nは、より一般的な再帰的なソリューションが必要になります。

于 2012-04-09T01:14:28.423 に答える
0

3 つの入れ子になったループ (文字位置ごとに 1 つ) が許可された 6 文字のそれぞれを反復するため、考えられるすべての組み合わせに対応するループ インデックスのセットがあり、有効なループ インデックスのすべてのセットに対応する 3 文字の文字列があることがわかりません。そして、ループ インデックスと文字列の間の 1 対 1 の対応は、あなたが探しているものです。

于 2012-04-09T01:15:32.533 に答える