Генератор вариантов x из y множества без повторений.

Автор: Dunadan KSMПросмотров: 10671

Недавно попросили, написать простенькую программку, для вывода всех возможных вариантов из определенного множества заданной длины, для чего мне не сказали smile, но явно как можно догадаться это для игр типа спортлото и тому подобных.

Вот скриншот программы:
Возможности программы:
  • задавать списки чисел от 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.

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

В рубрике: Программирование » Софт-обзор » Свои разработки » Софт

Теги:

Вы можете следить за комментариями к этой записи поRSS

Оставьте комментарий

аноним

совет Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

комментатор / стать им

как?Укажите свой действующий email и пароль. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные включая адрес сайта, ник, описание, контакты и т.д.

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)