2012-04-09 12 views
1

私はABCと123を使って3文字の文字列に対して216の異なる順列を作ることができるということを私は知っていますよね? (6 x 6 x 6)私は上記の例のための可能な順列を表示するC + +でコンソールプログラムを作成したいと思います。事は、どうすればそれらを計算しようとするのだろう。おそらく:ABCと123の3文字の文字列の順番の数を調べる

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

など

これは聞いて本当に難しいですが、私はあることを確実にするために何をすべきかを持っているでしょう私はすべての順列を含める?私は216があることを知っていますが、私は実際にそれらのすべてを通過する方法を知りません。

ご意見は大変ありがとうございます。

+0

2つのこと、宿題のように聞こえます...もしそうなら、教えてください。二番目に、私たちにいくつかのコードを見せてください。あなたはすでに何を試していますか? –

答えて

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が固定されていない場合は、より一般的な再帰的な解決策が必要になります。 3つのネストされたループ(文字位置につき1)6つの許可される文字のそれぞれの繰り返し処理で

+0

ありがとうございました。私はまだ初心者ですから、このコードのいくつかは私の頭の少し上ですが、もっと研究を重ねると、私はそれを理解できると確信しています。ありがとうございました!!!私はプライベートではなく、過負荷公開として、この機能を隠すでしょう。もちろん、 –

0

それはすべての可能性の組み合わせは、ループインデックスの対応するセットを持っており、法的なループインデックスのすべてのセットが持っていることを確認するためにない難しいです対応する3文字の文字列。ループインデックスと文字列の間の1-1の対応が、あなたが探しているものです。私は集まります。

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

これは完全ではありませんが、一般的な考え方を示します。 空のリスト、使用可能な文字の配列、空の文字列、および希望する文字列の長さのパラメータを指定して実行します。

+0

: '一覧 getAllCombinations、この再帰的なものを呼ぶだろう' (文字[]の文字は、StringLengthのint型)。 – Meeeee

+0

いいえ、これは宿題ではありません。私は代数から学んだ以前の知識を取り入れて順列の数を計算するだけです。私はまだ私の目標を達成する方法を知らないので、まだコードがありません。それが私がこの質問をした理由です。 –

関連する問題