1

再帰関数を使用して、この「スタイル」を維持しながら、繰り返しによる並べ替えをリストするのに問題があります。2次元配列の繰り返しを伴う並べ替えのリスト

、例えば2要素を有する「AB」及び「CD」、2次元アレイ状に:に

Element[0][0] = A; Element[0][1] = B; // AB  
Element[1][0] = C; Element[1][1] = D; // CD 

I(この場合2)n個の要素の繰り返しで全ての可能な順列を取得したいです(この場合は2)k個の基であり、例えば新しい2Dアレイ に保存:

Permutation[0][0] = AB; Permutation[0][1] = AB; // 1°: AB,AB 
Permutation[1][0] = AB; Permutation[1][1] = CD; // 2°: AB,CD 
Permutation[2][0] = CD; Permutation[2][1] = AB; // 3°: CD,AB 
Permutation[3][0] = CD; Permutation[3][1] = CD; // 4°: CD,CD 

要素と置換が二次元配列でなければなりません。戻って、わずか2のグループの2つの要素の順列に、

int i_perm = 0; 
    int i_element = 0; 
    int k_tot = 2; // number of groups 

    [...] 

    calcPerms(2); 

    [...] 

    private void calcPerms(int k) 
    { 
     if (k == 0) 
     { 
      if(i_perm + 1 < i_perm) 
       i_perm++; 

      i_element=0; 
     } 
     else 
     { 
      for (int i = 0; i < element.length; i++) 
      { 
       Permutation[i_perm][i_element][0] = Element[i][0]; 
       Permutation[i_perm][i_element][1] = Element[i][1]; 

       if(i_element + 1 < k_tot) 
        i_element++; 

       calcPerms(k - 1); 

       if(i_perm >= i_perm) 
        i_perm--; 

       Permutation[i_perm][i_element][0] = Element[i][0]; 
       Permutation[i_perm][i_element][1] = Element[i][1]; 
       if(i_element + 1 < k_tot) 
        i_element++; 
      } 
     } 
    } 

これは動作しますが、上記のように: 私はこの方法を試してみましたが、それは唯一の2つの群に2要素の順列で動作し、私はロックされています正しく:

ABAB、ABCD、CDAB、CDCD。私は(第三要素がEFである)の3つの要素を置けば実際に

は、それが返されます。

ABAB、ABCD、CDEF、EFAB、ABCD、CDEF、EFAB、ABCD、EFEF

の代わりに:

ABAB、ABCD、ABEF、CDAB、CDCD、CDEF、EFAB、EFCD、EFEF

どのように私は私が欲しいものを得ることができますか?あなたの助けのためのあなたのすべてに感謝し、何が必要なのリンクWikipediaのページに明確な擬似コードの実装がありますHeap's Algorithm

である私の悪い英語

+0

いくつかの注意次のようになります。A)それは "Javaの" ではないJAVAです。 B)あなたの質問のタグは関連する言語を識別するので、タイトルに入れる必要はありません。 – tadman

+1

申し訳ありません!助けてくれてありがとう – Doublem

+0

大したことはありません。この質問をサイトフォーマットに合わせて適切にしようとしています。 – tadman

答えて

0

をお詫び申し上げます。

非再帰的なバージョンは、この

procedure generate(n : integer, A : array of any): 
    c : array of int 

    for i := 0; i < n; i += 1 do 
     c[i] := 0 
    end for 

    output(A) 

    i := 0; 
    while i < n do 
     if c[i] < i then 
      if i is even then 
       swap(A[0], A[i]) 
      else 
       swap(A[c[i]], A[i]) 
      end if 
      output(A) 
      c[i] += 1 
      i := 0 
     else 
      c[i] := 0 
      i += 1 
     end if 
    end while 
+0

非常にいいコードですが、私を助けません。 ヒープのアルゴリズムは、 ABC、BAC、CAB、ACB、BCA、CBAのような繰り返しのない順列です。 私は繰り返しのような順列が必要です: AAA AAB AAC ABA ABB ABC ACA ACB ACC BAA [...] – Doublem

関連する問題