2
seregaЦитата:
Есть набор элементов: 1,2,3. Надо сгенерировать все возможные последовательности длиной 4, используя заданный набор эл-тов.
Можно обойтись и без знания комбинаторики. Достаточно заметить, что искомые последовательности суть числа над данным алфавитом (в вашем примере над "цифрами" 1, 2, 3).
То есть, имея некоторую последовательность-"число" можно сгенерировать следующую за ней просто прибавив единицу к исходной. Понятно, что прибавление единицы необходимо производить именно в вашем алфавите, а не в десятичных цифрах. Для этого годится обычное сложение в столбик из начальной школы. Другими словами, прибавляем единицу к самому младшему разряду, если произошло переполение, то производим перенос в следующий по старшенству разряд, etc. В качестве начальной последовательности необходимо взять последовательность нужной длины из самой маленькой цифры вашего алфавита (1111), и, затем, прибавлять в цикле к ней единицу пока не получите переполнение в самом старшем разряде.
Можно понимать этот алгоритм и так. Если обозначить ваш алфавит как
, то искомые последовательности фиксированной длины
будут, по-сути, просто элементами декартовой степени
. И, как вы понимаете, при маленьком статически заданном
можно даже просто обойтись набором вложенных циклов, e.g.:
for(i=1; i<=3; i++)
for(j=1; j<=3; j++)
...
printf("%d%d...", i, j, ...);
N.B., "цифрами" могут быть любые различимые объекты.
Цитата:
Кстати, а возможно ли такие последовательности генерировать в несколько потоков?
Да.