2016-06-13 5 views
0

私はK個のグループを持つMxN行列を持っています。グループは列の集合です。あるグループの列と他のグループの列の結合をどのように生成できますか? ( - 最初、3,4 - 1,2秒)の2列 - 例えば、2×4のマトリックス、群サイズの

私は組み合わせ
1取得 - 3
1 - 4
2 - 3
2 - 私はどのように3つのグループと2×6行列の場合について、複数のループに行列の列の組み合わせのためのC#再帰

for (int i = 0; i < 2; i++) 
    for (int j = 2; j < 4; j++) 
     Console.WriteLine("{0} - {1}", i, j); 

を使用することができます。この場合は4

for (int i = 0; i < 2; i++) 
    for (int j = 2; j < 4 ; j++) 
     for (int k = 4; k < 6; k++) 
      Console.WriteLine("{0} - {1} - {2}", i, j, k); 

他のケースはどうですか?どのようにサイクル/再帰を整理するのですか?

答えて

1

エッジケースと、この質問の行の役割わからない、しかし、あなたが提供される単純な例のためにこれは動作します:

static void Main() 
    { 
     var columns = 6; 
     var groupSize = 2; 

     var groups = GetGroups(columns, groupSize).ToArray(); 

     var groupCurrentIndex = Enumerable.Range(0, groups.Length).ToDictionary(i => i, i => 0); 
     var maxIndex = groupSize - 1; 

     while (true) 
     { 
      var combination = groups.Select((g, i) => g[groupCurrentIndex[i]]); 
      PrintCombination(combination); 

      var incrementedGroupIndex = false; 
      for (var i = groups.Length - 1; i > 0; i--) 
      { 
       if (groupCurrentIndex[i] != maxIndex) 
       { 
        groupCurrentIndex[i]++; 
        incrementedGroupIndex = true; 
        break; 
       } 
       if (groupCurrentIndex[i] == maxIndex && groupCurrentIndex[i - 1] != maxIndex) 
       { 
        groupCurrentIndex[i-1]++; 
        incrementedGroupIndex = true; 

        for (var j = i; j < groups.Length; j++) 
        { 
         groupCurrentIndex[j] = 0; 
        } 
        break; 
       } 
      } 
      if (!incrementedGroupIndex) 
      { 
       break; 
      } 
     } 

     Console.ReadLine(); 
    } 

    private static IEnumerable<int[]> GetGroups(int columns, int groupSize) 
    { 
     for (var startIndex = 0; startIndex < columns; startIndex = startIndex + groupSize) 
     { 
      yield return Enumerable.Range(startIndex, groupSize).ToArray(); 
     } 
    } 

    private static void PrintCombination(IEnumerable<int> combination) 
    { 
     Console.WriteLine(string.Join(" - ", combination)); 
    } 
関連する問題