Перебрать в цикле все возможные комбинации: вопрос оптимизации кода - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Задача следующая: есть несколько массивов. Пусть будет 5. Необходимо перебрать все возможные комбинации по 5 значений, каждое из которых выбирается из каждого массива. Вот этот код все делает как надо:
int temp = 0, res = 0;
for (int i = 0; i <= 10; i++)
{
     for (int j = 0; j <= 10; j++)
     {
          for (int k = 0; k <= 10; k++)
          {
                for (int l = 0; l <= 10; l++)
                {
                      for (int m = 0; m <= 10; m++)
                      {
                           for (int n = 0; n <= 10; n++)
                           {
                                for (int a = 0; a <= 10; a++)
                                {
                                     for (int b = 0; b <= 10; b++)
                                     {
                                           for (int c = 0; c <= 10; c++)
                                           {
                                                 for (int d = 0; d <= 10; d++)
                                                 {
                                                      temp = mas1[i][j]+mas2[k][l]+mas3[m][n]+mas4[a][b]+mas5[c][d];
                                                      if (temp > res)
                                                           res = temp;
                                                 }
                                           }
                                      }
                                 }
                            }
                       }
                  }
            }
      }
}
А вопрос в следующем: нельзя этот перебор сделать в 2-3 цикла? Ведь количество циклов прямо пропорционально количеству массивов...

Решение задачи: «Перебрать в цикле все возможные комбинации: вопрос оптимизации кода»

textual
Листинг программы
using System;
using System.Collections.Generic;
 
namespace ConsoleApplication157
{
    class Program
    {
        static void Main(string[] args)
        {
            var mas1 = new int[2][];
            mas1[0] = new int[] { 1, 2 };
            mas1[1] = new int[] { 3, 4 };
 
            var mas2 = new int[2][];
            mas2[0] = new int[] { 5, 6 };
            mas2[1] = new int[] { 7, 8 };
 
            var arrays = new[] { mas1, mas2 };
 
            foreach (var tuple in GenearateTuples(arrays))
            {
                //doing somewhat with tuples
            }
 
            Console.ReadLine();
        }
 
        private static IEnumerable<List<int>> GenearateTuples(IList<int[][]> arrays, int i = 0)
        {
            if (i < arrays.Count)
            {
                foreach (var subArr in arrays[i])
                foreach (var val in subArr)
                foreach (var tuple in GenearateTuples(arrays, i + 1))
                {
                     tuple.Add(val);
                     yield return tuple;
                }
            }
            else
                yield return new List<int>();
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5
Похожие ответы