2012-03-24 12 views
4

我想要做的是找到一個一維數組的每個排列並重復其內容。有像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 2012-03-24 18:06:54

+0

這也是:http://stackoverflow.com/questions/2380962/generate-all-combinations-of-arbitrary -alphabet向上到任意長度的 – Aziz 2012-03-24 18:08:43

回答

6

你不是在做置換,但只是計數。

Ex。如果您列舉超過3位數的{0,1},您將得到:

000 
001 
010 
011 
100 
101 
110 
111 

請參閱,這只是二進制計數。

所以你的映射元素設置成n個數字,然後做正基於計數會給你正確的awnser

0

我這個用Java編寫的。
非優化的代碼,但你的點:

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計算的整數的排列時爲k(具有重複):

  1. 最初設定第一置換爲1 1 1 ....(k次)。

  2. 找到最右邊的索引(如j),使得該索引處的元素小於k。

  3. 增量由一個所述索引j的元素的值,以及從位置j + 1至k的所有元素復位到1。

  4. 重複步驟2和3。

應用這樣的邏輯,我們現在得到:

第一置換 - > 111

然後,在位置2(0索引計數),我們有1 < 3 ,因此增加它並將此後的所有元素重置爲1.第二個排列 - > 1 1 2.

然後在位置1(0索引計數),我們有1 < 3,因此增加它並在此之後重置所有元素到1.第3排列 - > 1 2 1

依此類推。

相關問題