2012-03-24 9 views
4

私がしたいことは、その内容の繰り返しで1次元配列のすべての順列を見つけることです。next_permutationのような関数がありますが、繰り返しのある順列の関数はありますか?

int array[]={1,2,3}; 
for(i=0;i<3;i++){ 
    next_permutation(array,array+3) 
    for(int j=0;j<=3;j++){ 
     printf("%d ",array[j]); 
    } 
printf("\n"); 
} 

が返されます:

1 2 3 
1 3 2 
2 1 3 
etc... 

私は関数が返すようにしたいものを:

1 1 1 
1 1 2 
1 2 1 
2 1 1 
1 2 2 
2 2 1 
2 1 2 
1 1 3 
1 3 1 
3 1 1 
etc... 

それを行うことができます機能がありますか?事前に

おかげで、 エリック

+0

これは関連性があります:http://stackoverflow.com/questions/1944508/arbitrary-digit-counter – Aziz

+0

これも:http://stackoverflow.com/questions/2380962/generate-all-combinations-of-任意アルファベット〜任意の長さ – Aziz

答えて

6

あなたは順列をやってますが、単にカウントされていません。

Ex。あなたの列挙セット{0、1}が3桁を超える場合は、

000 
001 
010 
011 
100 
101 
110 
111 

を参照してください。

だから私はJavaでこれを書いていた、その後のnベースのカウントはあなたに

0

を右awnserを与えるか、あなたの要素がn桁に設定されているマップ。
以外は、コードを最適化していますが、ポイントを得る:(繰り返して)1からkに整数の順列を計算するとき、一般的に

String [] data = {"1","2","3"}; 
public void perm(int maxLength, StringBuffer crtComb){ 

    if (crtComb.length() == maxLength){ 
     System.out.println(crtComb.toString()); 
     return; 
    } 

    for (int i=0; i<data.length; i++){ 
     crtComb.append(data[i]); 
     perm(maxLength, crtComb); 
     crtComb.setLength(crtComb.length()-1); 
    } 

} 
0

を:

  1. 1 1 1として、当初設定された第1の順列....(k回)。

  2. インデックスの要素がkより小さいように右端のインデックス(jとする)を見つけます。

  3. 増分ずつインデックスjの要素の値、および位置jから+ 1 1.

  4. 繰り返し適用2,3

ステップにすべての要素をリセットkにこのロジックは、我々は今取得:

第一の順列 - > 1 1.

1は、次に位置2(0インデックスカウント)で、我々は1 < 3 2番目の置換 - > 1 1 2.

位置1(インデックスカウント)で、1があるので、これをインクリメントし、この後にすべての要素をリセットします第3の順列 - > 1 2 1

など。

関連する問題