Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
4 / 4 / 1
Регистрация: 20.09.2012
Сообщений: 74

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

30.01.2015, 13:04. Показов 4768. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Задача следующая: есть несколько массивов. Пусть будет 5. Необходимо перебрать все возможные комбинации по 5 значений, каждое из которых выбирается из каждого массива. Вот этот код все делает как надо:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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 цикла? Ведь количество циклов прямо пропорционально количеству массивов...
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.01.2015, 13:04
Ответы с готовыми решениями:

Перебрать все возможные комбинации символов и в верхнем, и в нижнем регистрах
На вход подаётся массив символов в нижнем регистре, необходимо перебрать все возможные комбинации символов и в верхнем, и в нижнем...

Перебрать все возможные комбинации цифр, потом совершить то же самое со строкой
Задача: Перебрать все комбинации, на подобии: 0011 0110 0101 1010 1001 1100 Только для восьми ячеек (из &quot;0000...

Перебрать все возможные комбинации
Доброго времени суток. Столкнулся с такой задачей и не знаю, как подступится. Опишу своими словами. Есть четыре столбика слов. В...

9
Заблокирован
30.01.2015, 13:13
AlikSoldier, поясните на примере. Так не понятно, что вы хотите сделать.
0
 Аватар для ture
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
30.01.2015, 13:26
AlikSoldier, Рекурсия?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
30.01.2015, 13:33
Цитата Сообщение от AlikSoldier Посмотреть сообщение
Вот этот код все делает как надо
Упасть не встать, букв хоть хватило?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System;
using System.Linq;
 
namespace ConsoleApplication157
{
    class Program
    {
        static void Main(string[] args)
        {
            var mas1 = new int[2][] ;
            mas1[0] = new int[] { 2, 3 };
            mas1[1] = new int[] { 1, 2 };
 
            var mas2 = new int[2][];
            mas2[0] = new int[] { 4, 5 };
            mas2[1] = new int[] { 8, 6 };
 
            var arrays = new[] {mas1, mas2};
 
            var max = arrays.Sum(arr => CalcMax(arr));
 
            Console.WriteLine(max);
            Console.ReadLine();
        }
 
        private static int CalcMax(int[][] arr)
        {
            var res = int.MinValue;
            foreach (var subMas in arr)
                res = Math.Max(res, subMas.Max());
            return res;
        }
    }
}
0
4 / 4 / 1
Регистрация: 20.09.2012
Сообщений: 74
30.01.2015, 13:49  [ТС]
Ev_Hyper, есть 5 двухмерных массивов [10][3].
Необходимо перебрать для каждой точки каждого массива все точки других массивов. Например, берем 1 точку массива 1 (значение 0), и для этого значения перебираем все точки (по одной) из остальных массивов. Будут следующие комбинации:
1. {mas1[0][0], mas2[0][0], mas3[0][0], mas4[0][0], mas5[0][0]}
2. {mas1[0][0], mas2[0][0], mas3[0][0], mas4[0][0], mas5[0][1]}
...
5. {mas1[0][0], mas2[0][0], mas3[0][0], mas4[0][0], mas5[0][4]}
6. {mas1[0][0], mas2[0][0], mas3[0][0], mas4[0][0], mas5[1][0]}
7. {mas1[0][0], mas2[0][0], mas3[0][0], mas4[0][0], mas5[1][1]}
...
n-1. {mas1[0][0], mas2[0][0], mas3[0][0], mas4[0][1], mas5[0][0]}
n. {mas1[0][0], mas2[0][0], mas3[0][0], mas4[0][1], mas5[0][1]}
...
и т.д.

Добавлено через 8 минут
Storm23, спасибо, но вычисление максимальной суммы в теме приведено для примера. Выполнять нужно другие действия, для чего необходим именно перебор всех значений без исключения.

Добавлено через 1 минуту
ture, думал про рекурсию, но сообразить не могу, как ее сделать...
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
30.01.2015, 13:50
Цитата Сообщение от AlikSoldier Посмотреть сообщение
Storm23, спасибо, но вычисление максимальной суммы в теме приведено для примера. Выполнять нужно другие действия, для чего необходим именно перебор всех значений без исключения.
Тогда сразу формулируйте правильную задачу, плз.
Ок, перебираете вы все комбинации. А что вы с ними делаете? Толи вам нужно на выходе список всевозможных пар, то ли вы с ними делаете какие-то вычисления?
0
4 / 4 / 1
Регистрация: 20.09.2012
Сообщений: 74
30.01.2015, 13:56  [ТС]
Storm23,
Цитата Сообщение от Storm23 Посмотреть сообщение
Тогда сразу формулируйте правильную задачу, плз.
Я сразу правильно сформулировал:
Здравствуйте! Задача следующая: есть несколько массивов. Пусть будет 5. Необходимо перебрать все возможные комбинации по 5 значений, каждое из которых выбирается из каждого массива.
Цитата Сообщение от Storm23 Посмотреть сообщение
А что вы с ними делаете? Толи вам нужно на выходе список всевозможных пар, то ли вы с ними делаете какие-то вычисления?
Делаю вычисления в процессе перебора, т.е. в самом вложенном цикле.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
30.01.2015, 14:22
Лучший ответ Сообщение было отмечено AlikSoldier как решение

Решение

Цитата Сообщение от AlikSoldier Посмотреть сообщение
Я сразу правильно сформулировал
Да, но вы написали что "Вот этот код все делает как надо", из чего можно сделать однозначный вывод, что код делает как надо, и вы только недовольны количеством циклов.
Цитата Сообщение от AlikSoldier Посмотреть сообщение
Необходимо перебрать все возможные комбинации по 5 значений, каждое из которых выбирается из каждого массива.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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>();
        }
    }
}
1
4 / 4 / 1
Регистрация: 20.09.2012
Сообщений: 74
05.02.2015, 10:13  [ТС]
Большое спасибо!
Цитата Сообщение от Storm23 Посмотреть сообщение
Да, но вы написали что "Вот этот код все делает как надо", из чего можно сделать однозначный вывод, что код делает как надо, и вы только недовольны количеством циклов.
Виноват, надо было написать, что для примера вычисляется максимальная сумма элементов.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
05.02.2015, 10:18
AlikSoldier, И кстати, если бы вы использовали двумерные массивы вместо вложенных, там бы на один foreach было бы меньше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.02.2015, 10:18
Помогаю со студенческими работами здесь

Перебрать все возможные комбинации цифр
Помогите написать код, котрый будет выводить все числа, например, в троичной системе. Т. е. Нам даны числа 0,1,2. Нужно вывести 0 1 2...

Как перебрать все возможные комбинации из n объектов?
Доброго дня, пытаюсь написать программу которая бы перебрала все возможные комбинации из n объектов или конкретнее у нас есть массив...

Перебрать все возможные комбинации трех фигур
подскажите как реализовать такое: есть три фигуры - круг,квадрат,треугольник необходимо создать возможные комбинации из 3,4,5,6,7,8,9,...

Перебрать все возможные комбинации заданных символов
нужно программа, которая перебирает все возможные комбинации заданных символов,

Перебрать все возможные комбинации трех чисел от нуля до двух
Здравствуйте, помогите, пожалуйста, разобраться с темой (лучше всего написать код, а то на словах вроде понятно, но код всё же лучше) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru