Собрать в другой массив все возможные комбинации исходного - C (СИ)

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

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

Всем привет, помогите, пожалуйста. Есть массив строк
char *mS={"Один", "Два", "Три", "Четыре"};
Нужно собрать в другой массив все возможные комбинации, например: "Один" "Два" "Три" "Четыре" "Один" "Два" "Один" "Три" и т. п.

Решение задачи: «Собрать в другой массив все возможные комбинации исходного»

textual
Листинг программы
    char *mS[]={"one", "two", "three", "four"};
    const unsigned sz = sizeof(mS)/sizeof(*mS);
    unsigned m_idx[sz], m_idx_n;
    unsigned n, i, t, idx1, idx2, a, p, j, ind;
    for(n = 1; n < (1 << sz); n++)
    {
        m_idx_n = 0;
        for(i = 0; i < sz; i++)
            if( (n & (1 << i)) != 0)
                m_idx[m_idx_n++] = i;
        for(ind = 1; ; ind++)
        {
            a = ind, p = 0, j;
            for(unsigned i = 0; i < m_idx_n; i++)
                std::cout << mS[m_idx[i]] << ' ';
            std::cout << std::endl;
            for(j = m_idx_n; j > 0; j--)
            {
                int x = a % j; 
                a /= j;
                if(x != 0)
                {
                    if(a % 2 != 0) 
                        x = j - x;
                    idx1 = p + x;
                    idx2 = p - 1 + x;
                    t = m_idx[idx1];
                    m_idx[idx1] = m_idx[idx2];
                    m_idx[idx2] = t;
                    break;
                } 
                else 
                    p += 1 - a%2;
            }
            if(j == 0) 
                break;
        }
    }

Объяснение кода листинга программы

В этом коде представлен алгоритм перебора всех возможных комбинаций элементов в массиве. Код начинается с объявления массива mS типа char* с четырьмя элементами. Затем определяется переменная sz, которая содержит размер массива mS. Далее, в цикле for перебираются все возможные комбинации битов в n (представляющем собой двоичное представление числа от 1 до sz). Для каждой комбинации создается новый массив m_idx размером sz, в который добавляются индексы элементов, которые присутствуют в текущей комбинации. Затем следует вложенный цикл for, который перебирает все индексы в m_idx. Для каждого индекса выводится соответствующий элемент из массива mS. Далее, начинается основной цикл, который перебирает все комбинации, начиная с индекса a (который всегда четный) и до тех пор, пока не будет найден элемент, который делится на j без остатка. Когда такой элемент найден, он помещается на свою позицию в m_idx (то есть, idx1 и idx2 обмениваются местами). Если такого элемента не найдено, то значение a увеличивается на j, и цикл продолжается. Если j становится равным 0, это означает, что все возможные комбинации были перебраны, и цикл завершается. По завершении всех циклов, выводится окончательный результат.

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


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

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

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