Составить возможные комбинации

Задача — есть несколько множеств — {A1, A2, A3, ...}, {B1, B2, B3, ...}, {C1, C2, C3, ...} и т.д., необходимо составить все возможные комбинации элементов таким образом, чтобы в комбинации присутствовал один и только один элемент из каждого множества:
A1, B1, C1
A2, B1, C1
A3, B1, C1
A1, B2, C1
и т.д.

Подскажите плиз наиболее грамотный алгоритм.
  • Вопрос задан
  • 9296 просмотров
Пригласить эксперта
Ответы на вопрос 6
Вложенные циклы?
Ответ написан
Комментировать
TheHorse
@TheHorse
for (int i = 0; i < a.count; i++)
for (int k = 0; k < b.count; k++)
for (int j = 0; j < c.count; j++)
count << a[i] << b[k] << c[j]
Ответ написан
Есть еще
— вариант с рекурсией до глубины, равной букве
и
— вариант с одним циклом от 0 до ACount*BCount*...*ZCount-1 и затем определением всех текущих индексов mod/div-ом.
Ответ написан
TheHorse
@TheHorse
А… Ой… Сипец. Простите за комменты и предидущие ответы, не осилил, что количество множеств — не константа.
Ответ:
Если есть массив A множеств /массивов Ai, алгоритм таков:

int c = 1;
int* divs = new int[A.count];

divs[A.count — 1] = 1;
for (int i = A.count -2; i >= 0; i++)
divs[i] = divs[i+1]*A[i].count;

for (int i = 0; i < A.count; i++) c *= A[i].count; //c — количество

int i = 0;
while (i < c)
{
for (int k = 0; k < A.count; k++)
cout << (i / divs[k]) % A[k].count;
count << endl;
i++;
}

Как-то так. Это то о чем говорил OLS. — вариант с одним циклом от 0 до ACount*BCount*...*ZCount-1 и затем определением всех текущих индексов mod/div-ом.
Ответ написан
мне все-таки кажется, что через рекурсию это быстрее пишется, меньше шанс ошибиться:

procedure Recur(iLevel:integer);
var i:integer;
begin
if iLevel=iLevelCount then Process(X)
                      else
   for i:=0 to Ai[iLevel].Count-1 do
       begin
       X[iLevel]:=Ai[iLevel][i];
       Recur(iLevel+1)
       end;
end;

Recur(0);
Ответ написан
Комментировать
@Ano
python:

import itertools

sets = ( ('A1', 'A2', 'A3'), ('B1', 'B2', 'B3'), ('C1', 'C2', 'C3') )

combinations = itertools.product(*sets)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы