Генератор вариантов x из y множества без повторений.
3 Января, 2011Просмотров: 15366
Недавно попросили, написать простенькую программку, для вывода всех возможных вариантов из определенного множества заданной длины, для чего мне не сказали , но явно как можно догадаться это для игр типа спортлото и тому подобных.
Вот скриншот программы:
Возможности программы:
- задавать списки чисел от 0 до 99
- сохранять загружать списки
- указывать длину множества
- сохранять результат в файл
Теперь немного с программной стороны, главной функцией в выборе множества является рекурсия:
void Cgener_digitsDlg::Rec(int ind, CString txt, int glub, int len)
{
if (glub>len)
{
result_gen+=txt+L"\r\n";
}
else
for(int i=ind;i<100;i++)
if (digits_ar[i]!=0)
{
CString txt1=txt;
if (glub>1)txt1 +=",";
char buf[10];
if(i!=99)itoa((i+1), buf,10); else itoa((0), buf,10);
txt1+=buf;
Rec(i+1, txt1, glub+1,len);
}
}
В переменной result_gen сохраняем результат, который потом выведется в окошко, почему в переменную сначала, а не на экран, так это потому что функция вывода на экран в многострочную часть очень медленная, и поэтому для скорости вычислений будем сохранять в переменную, перебор ведем относительно массива, в котором просто стоят флаг 0 или 1(1 выбрана цифра), поэтому следующий шаг в переборе всегда больше индекса предыдущего, что так же очень сильно сокращает лишний перебор. Входные параметры в рекурсии ind - индекс следующего элемента, txt - составленная последовательность на текущем шаге, glub - текущая глубина, len- расчетная глубина.
Вот собственно программа gener_digits.zip.
В рубрике: Программирование » Софт-обзор » Свои разработки » Софт
Теги: вариантов генератор множество повторения разработка
Вы можете следить за комментариями к этой записи поRSS
Оставьте комментарий