Собрать в другой массив все возможные комбинации исходного - 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, это означает, что все возможные комбинации были перебраны, и цикл завершается.
По завершении всех циклов, выводится окончательный результат.