Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Простой перебор n-числа переменных


Автор: Salatovec 14.12.2011, 21:24
Доброго всем времени суток.

Подскажите, пожалуйста, как запрограммировать перебор всех комбинаций последовательности чисел, ну вот к пример:

дана последовательность чисел 1, 2 и 3. Комбинации этих чисел:

123
132
213
231
312
321

Такое маленькое количество комбинаций можно и вручную записать, конечно. А вот к примеру если чисел будет 8? Или 20?

Заранее огромное спасибо!




Автор: hawk3500 14.12.2011, 22:33
http://progpage.narod.ru/alg/per.html

Google в помощь)

Автор: volatile 15.12.2011, 00:08
Вот такая наиогромнейшая программулина переберет все варианты   smile  
Код

int main()
{
   char str[] = "123"; //<= сюда добавить символы которые нужны
   do
      std::cout << str << std::endl;
   while (std::next_permutation( str, str+sizeof(str)-1));
}
 http://liveworkspace.org/code/af6e49841df5c5ff373e87b91412afad

Но осторожно. потому-что кол-во вариантов равно факториалу от кол-ва символов

Добавлено через 2 минуты и 36 секунд
да, чуть не забыл, символы должны быть отсторированы
ну или, просто поместите перед do
Код

std::sort (str, str+sizeof(str)-1);


Автор: Salatovec 15.12.2011, 20:52
Цитата(hawk3500 @  14.12.2011,  22:33 Найти цитируемый пост)
http://progpage.narod.ru/alg/per.html

Google в помощь) 


Спасибо за ссылку, постараюсь разобраться)

Цитата(volatile @  15.12.2011,  00:08 Найти цитируемый пост)
Вот такая наиогромнейшая программулина переберет все варианты     
код C++

int main()
{
   char str[] = "123"; //<= сюда добавить символы которые нужны
   do
      std::cout << str << std::endl;
   while (std::next_permutation( str, str+sizeof(str)-1));
}
 http://liveworkspace.org/code/af6e49841df5...73e87b91412afad

Но осторожно. потому-что кол-во вариантов равно факториалу от кол-ва символов

Добавлено через 2 минуты и 36 секунд
да, чуть не забыл, символы должны быть отсторированы
ну или, просто поместите перед do
код C++
1:
std::sort (str, str+sizeof(str)-1);


Спасибо, кода немного и всё поняно, разобрался. Один только вопрос - а что если в комбинации у меня присутствуют числа от 10 и выше? К пример 123456789'10'. Ведь алгоритм 10 распознает как 0 и 1. Как быть?

Автор: newbee 15.12.2011, 20:55
Цитата(Salatovec @  15.12.2011,  21:52 Найти цитируемый пост)
Ведь алгоритм 10 распознает как 0 и 1. Как быть?
Использовать массив чисел вместо массива букв.

Думаю, задача у тебя самому написать алгоритм перебора, а не воспользоваться стандартным готовым.

Автор: Salatovec 15.12.2011, 21:06
Цитата(newbee @  15.12.2011,  20:55 Найти цитируемый пост)
Цитата(Salatovec @  15.12.2011,  21:52 )
Ведь алгоритм 10 распознает как 0 и 1. Как быть?
Использовать массив чисел вместо массива букв.

Думаю, задача у тебя самому написать алгоритм перебора, а не воспользоваться стандартным готовым. 


Задача именно перебрать, а уж как - неважно...

Автор: volatile 15.12.2011, 23:47
http://liveworkspace.org/code/b170527b515c2bbe56b3ab9ef0cac358

Автор: Qu1nt 16.12.2011, 12:11
С использованием C++11.
Код

#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>

using namespace std;

int main()
{
    vector<int> data { 10, 20, 30 };   
    sort(begin(data), end(data));
    do
    {
        copy(begin(data), end(data), ostream_iterator<int>(cout << endl, " "));
    } while (next_permutation(begin(data), end(data)));
}

Автор: Salatovec 17.12.2011, 00:06
Спасибо всем за помощь огромное! Ответили по факту, даже более чем smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)