2017-05-16 13 views
0

は、私には、例えば、整数の配列を持っている: 配列 - インデックスの組み合わせ

int[][] matrix = new int[][] { 
    new int[2], // array a, 
    new int[2], // array b, 
    new int[3], // array c, 
    new int[4], // array d, 
    // ...  // array x 
}; 

は、今私は、A、B、Cの各列からいずれかを選択可能なすべてのインデックスの組み合わせを生成したいです.. 。xは

これは一例に意味:{新しいINT [2]、新しいINT [2]、新しいINT [3]}、Iは、インデックス組み合わせ取得したい:

{a[0], b[0], c[0]} 
{a[0], b[0], c[1]} 
{a[0], b[0], c[2]} 
{a[0], b[1], c[0]} 
{a[0], b[1], c[1]} 
{a[0], b[1], c[2]} 
{a[1], b[0], c[0]} 
{a[1], b[0], c[1]} 
{a[1], b[0], c[2]} 
{a[1], b[1], c[0]} 
{a[1], b[1], c[1]} 
{a[1], b[1], c[2]} 

長行列のすべての配列は未知であるが、少なくとも1つの要素。

誰にも解決策がありますか?

+0

が最初に自分を試してみてください。特定の質問に遭遇したときは、ここで質問してください。 SOはコード作成サービスではありません。 – Sefe

+0

これはコードを記述するのではなく、動作するアルゴリズムを見つけるのが難しい問題だと思います。私が問題について考えると、混乱するほどです。私の理解では、これを解決するために古典的な順列を使用することはできません。私は正しい? –

+0

@JulianHerbel:私はそれを理解していません。配列には3つのインデックス、0,1,2がありますが、結果配列には1,2,3が含まれています。ソース配列の値はまったく重要ではありませんか? –

答えて

1

配列{L1、L2、L3、... Ln}のすべてのインデックス結合を生成する方法を次に示します。 開発として、「バイナリシステム、8進システム、10進システム、16進システム」について学習しておく必要があります。バイナリシステムでは0000から1111まで、3進システムでは0000から2222まで、4システムでは0000から3333までの数え方を考えてみてください。

あなたの質問は、最初の数字は(a + 1) - システム、2番目の数字は(b + 1) - システム、3番目の数字は(c + 1) - システムなど。

000からabcに数える方法を考えてください。

000  // start form zero, and add 1 
001  // add 1 again 
... 
xyz  // add 1 again, it becomes to xy(z+1) 
xy(z+1) // check, if (z+1 > c), (xyz + 1) should be x(y+1)0; check again, if (y+1 > b), x(y+1)0 should be (x+1)00; check again, if (x+1 > a), (x+1)00 should be 1000. 
... 
00(c-2) // add 1 
00(c-1) // add 1 
00c  // add 1 
010  // 00(c+1), should be 010 
... 
0b(c-1) // add 1 
0bc  // add 1 
100  // 0b(c+1) == 0(b+1)0 == 100 
101  // 
... 
abc  // 
1000 // ab(c+1) == a(b+1)0 == (a+1)00 == 1000 
... 

ここにコードがあります。

class MainClass 
{ 
    public static void Main(string[] args) 
    { 
     printAll(new int[] { 2, 2, 4}); 
     printAll(new int[] { 3, 3, 4, 5, 6 }); 
     printAll(new int[] { 3, 3, 4, 5, 6, 7, 8, 9}); 
    } 

    public static void printAll(int[] array) 
    { 
     int max = 1; 
     for (int i = 0; i < array.Length; i++) 
     { 
      max *= array[i]; 
     } 

     for (int row = 0; row < max; row++) 
     { 

      int[] line = new int[array.Length]; 

      int weight = 1; 
      for (int j = 0; j < array.Length; j++) 
      { 
       int times = row/weight; 
       // line[j] = times % array[j]; // but you want to start form 1 
       line[j] = 1 + (times % array[j]); 
       weight *= array[j]; 
      } 

      Console.WriteLine(String.Join(",", line)); 
     } 
    } 
} 
+0

それはブラックボックスとしてテストされ、それは私のために働く。私は現時点では完全に理解していませんが、私はそれに取り込もうとしています。どうもありがとうございました!また、私はプログラミングの他の数のシステムについて学ぶ必要があります。そのヒントありがとう! –

0

あなたはこれを試すことができます。

List<int> list = new List<int>(){1, 2, 3}; 
     List<int> lstResult = new List<int>(); 
     for (int i = 0; i < 3; i++) 
     { 
      for (int j = 0; j < 3; j++) 
      { 
       for (int z = 0; z < 3; z++) 
       { 
        //Check if it exist before adding 
        if (!lstResult.Contains(int.Parse(list[i].ToString() + list[i].ToString() + list[z].ToString()))) 
        { 
         lstResult.Add(int.Parse(list[i].ToString() + list[i].ToString() + list[z].ToString())); 
        } 
       } 
       //Check if it exist before adding 
       if (!lstResult.Contains(int.Parse(list[i].ToString() + list[j].ToString() + list[i].ToString()))) 
       { 
        lstResult.Add(int.Parse(list[i].ToString() + list[j].ToString() + list[i].ToString())); 
       } 
      } 
     } 
関連する問題