Генерация всех комбинаций с неизвестной длиной

Я занимаюсь программированием и создаю все комбинации на С ++. Я знаю, как генерировать все комбинации в
определенная длина
Мой результат примерно такой

A A A
A A B
A A C
A B A
A B B
A B C
A C A
A C B
A C C
B A A
.....

и моя проблема, я не знаю, как генерировать все комбинации с неизвестной длиной. Например, я хочу, чтобы длина слова = 5, и программа сгенерирует все комбинации точно в длину 5. Как это сделать?

A A A A A
A A A A B
A A A A C
A A A B A
.........

(Извините за мой английский)

0

Решение

Смотрите ссылку Распечатать все перестановки с повторением символов

Приведенная ниже рекурсивная функция на странице может создавать последние + 1 перестановки длины.

/* The main function that recursively prints all repeated
permutations of  the given string. It uses data[] to store all
permutations one by one */
void allLexicographicRecur (char *str, char* data, int last, int index)
{
int i, len = strlen(str);

// One by one fix all characters at the given index and recur for
// the/ subsequent indexes
for ( i=0; i<len; i++ )
{
// Fix the ith character at index and if this is not the last
// index then recursively call for higher indexes
data[index] = str[i] ;

// If this is the last index then print the string stored in
// data[]
if (index == last)
printf("%s\n", data);
else // Recur for higher indexes
allLexicographicRecur (str, data, last, index+1);
}
}

Я думаю, что это может служить вашей цели.
Вызов allLexicographicRecur с требуемым значением (length-1) для параметра ‘last’.

1

Другие решения

На самом деле это не более чем подсчет.

Если у вас есть буквы A, B и C, вы считаете в базе 3.
А равно 0, В равно 1 и С равно 2.

Быстро и грязно:

#include <string>
#include <iostream>

int main()
{
for(int i = 0; i < 100; i++) {
const int base = 3;
const char zero_char = 'A';
const size_t length = 5;
std::string out;
for(int n = i; n > 0; ) {
int d = n%base;
out = static_cast<char>(zero_char + d) + out;
n /= base;
}
while(out.length() < length) out = zero_char + out;
std::cout << out << '\n';
}
}

увидеть это в прямом эфире


Возможные комбинации базадлина, поэтому, если вы хотите, чтобы все комбинации для A, B, C состояли из 5 цифр, измените предел первого for цикл до 35 (= 243):

for(int i = 0; i < 243; i++)
1

Вы можете использовать что-то вроде:

bool increase(const std::string& s, std::vector<std::size_t>& it)
{
for (std::size_t i = 0, size = it.size(); i != size; ++i) {
const std::size_t index = size - 1 - i;
++it[index];
if (it[index] >= s.size()) {
it[index] = 0;
} else {
return true;
}
}
return false;
}

void do_job(const std::string& s,
const std::vector<std::size_t>& it)
{
for (std::size_t i = 0; i != it.size(); ++i) {
std::cout << s[it[i]] << " ";
}
std::cout << std::endl;
}

void cartesian_product(const std::string& s, std::size_t n)
{
std::vector<std::size_t> it(n, 0u);

do {
do_job(s, it);
} while (increase(s, it));
}

демонстрация

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector