Собрать в другой массив все возможные комбинации исходного - C (СИ)
Формулировка задачи:
char *mS={"Один", "Два", "Три", "Четыре"};
Решение задачи: «Собрать в другой массив все возможные комбинации исходного»
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, это означает, что все возможные комбинации были перебраны, и цикл завершается.
По завершении всех циклов, выводится окончательный результат.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д