2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Перебор всех возможных вариантоа
Сообщение15.12.2014, 11:15 
Здравствуйте! Помогите, пожалуйста, придумать КРАСИВОЕ решение следующей проблемы. Необходимо организовать перебор всех возможных вариантов символов в определенном количестве позиций. Т.е., например, если есть 3 позиции, а допустимые символы представляют собой цифры от 0 до 9, то имеем 10$^$3 возможных вариантов. Если символами являются символы (a - f), то имеем 6$^$3 возможных вариантов и т.д.
Я реализовал простенький алгоритмик, но он крайне не красив. Потому что я предполагаю детерминированное определение количества позиций. А мне бы хотелось в конечном итоге, чтобы это количество было переменной.

Примеч.: //dynamicMas - выделяемый мной динамический массив, размерностью [x$^$3, 3] (x - количество перебираемых символов)
//masLength - допустимое количество строк данного массива
//enableSymb - строка перебираемых символов, ограниченная '\0'

Код:
char **MasFulling(char **dynamicMas, int masLength, char *enableSymb)
{
   for (int i = 0, j = 0, k = 0, l = 0; i < masLength; i++)
   {
      char inputLetter = *(enableSymb + j);
      int minInd = 0;

      if (inputLetter == '\0')
      {
         j = 0;
         k = k + 1;
         if(*(enableSymb + k) == '\0')
         {         
            k = 0;
            l = l + 1;
            dynamicMas[i][minInd + 2] = *(enableSymb + l);            
         }

         dynamicMas[i][minInd + 2] = *(enableSymb + l);
         dynamicMas[i][minInd + 1] = *(enableSymb + k);
         dynamicMas[i][minInd] = *enableSymb;
         goto exit;
      }
   
   dynamicMas[i][minInd + 2] = *(enableSymb + l);
   dynamicMas[i][minInd + 1] = *(enableSymb + k);
   dynamicMas[i][minInd] = inputLetter;
   exit:
   j++;
   }


Очень хочется сделать красивое решение, а как не знаю(

 
 
 
 Re: Перебор всех возможных вариантоа
Сообщение15.12.2014, 12:15 
Количество позиций переменное?

 
 
 
 Re: Перебор всех возможных вариантоа
Сообщение15.12.2014, 14:12 
1. А где, стесняюсь спросить, return?
2. Ну, попробуйте начать. Пример для трёх у вас есть. Как работать с переменным количеством однотипных переменных?

 
 
 
 Re: Перебор всех возможных вариантоа
Сообщение15.12.2014, 17:30 
У вас код функции не до конца вставился. Там в конце return dynamicMas? Его не обязательно возвращать, т.к. вы заполнили переданный массив и можете пользоваться им. Красивое решение будет через рекурсию, если вы её проходили :-).

 
 
 
 Re: Перебор всех возможных вариантоа
Сообщение19.12.2014, 21:12 
Первый способ решить задачу:
1. Написать фукцию "следующая комбинация".
Завидите массив по размеру комбинации (3 в вашем примере). Заполняете его первым символом. Это первая комбинация.

Функция "следующая комбинация":
1. Задаём индекс равным нулю.
2. Если символ по этому индексу не последний, то заменяем его на следующий и выходим (следующая комбинация готова).
3. Если символ по этому индексу последний, то заменяем его на первый.
4. Увеличиваем индекс на единицу.
5. Если индекс не вышел за пределы массива, то идём в п. 2.
6. Выходим совсем (комбинации кончились).

Порядок перебора будет такой для (двух символов из набора a, b, c ):
aa, ba, ca, ab, bb, cb, ac, bc, cc, (всё, комбинации кончились)

-- 19.12.2014, 21:19 --

Второй способ решить задачу:

Каждой комбинации сопоставлен её номер. По номеру(числу) можно восстановить комбинацию так:
Из числа берём остаток по количеству символов. Это будет номер первого символа. Всё число делим нацело на количество символов.
Снова берём остаток по количеству символов. Это будет номер второго символа. Опять число делим нацело на количество символов.
Повторяем столько раз сколько у нас символов в комбинации.

Чтобы перебирать комбинации достаточно перебирать их номера, а по номерам восстанавливать комбинации.
Работает только если общее число комбинаций помещается в целочисленный тип.

 
 
 
 Re: Перебор всех возможных вариантоа
Сообщение19.12.2014, 23:51 
Аватара пользователя
 i  Тема перемещена в Карантин.

Запишите формулы в соответствии с требованиями Правил форума, т.е. в $\TeX$.
Краткие инструкции можно найти здесь: topic8355.html и topic183.html.
Кроме этого, в теме Видео-пособия для начинающих форумчан можно посмотреть видео-ролик "Как записывать формулы".

После того как исправите сообщение, сообщите об этом в теме Сообщение в карантине исправлено.


 !  slavav, замечание за размещение практически полного решения учебной задачи.

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group