Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2012, 10:12   #1
David Villa
Пользователь
 
Аватар для David Villa
 
Регистрация: 24.12.2011
Сообщений: 54
По умолчанию Перебор неповторяющихся сочетаний

Здравствуйте. Существует ли какая-нибудь функция на c++, которая перебирает все возможные перестановки без повторений элементов? (например для чисел
1 2 3 4 это будет
1 2
1 3
1 4
2 3
2 4
3 4
1 2 3
1 2 4
1 3 4
2 3 4

А если такой функции не существует, то какой алгоритм для такого перебора?
David Villa вне форума Ответить с цитированием
Старый 08.05.2012, 10:29   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Функция - не знаю, а алгоритм примерно такой
Сначала берешь первое сочетание нужной длины. Потом идешь справа-налево и ищешь элемент, который можно увеличить на 1 (а его можно увеличить, если удастся сделать следующее действие). Когда нашел - увеличиваешь, а справа оставшиеся заполняешь минимально возможными по возрастанию. Пример:
Сочетания длины 3 из 5 элементов:
123 - пытаемся увеличить самый правый, он < 5, все ок
124 - то же самое
125 - самый правый не увеличить, второй можно увеличить и заполнить оставшиеся:
134 - самый правый
135 - второй
145 - второй нельзя, т.к. получится 156, поэтому левый
234 - правый
235 - второй
245 - если второй, то 256, поэтому левый
345
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 08.05.2012, 10:43   #3
David Villa
Пользователь
 
Аватар для David Villa
 
Регистрация: 24.12.2011
Сообщений: 54
По умолчанию

Спасибо, но суть в том что перебираться будут не только числа, но и буквы, то есть нельзя сделать +1 и сравнить. И одной длины сочетаний тоже нет, так как надо перебрать все возможные длины. Изначально известно только число перебираемых элементов. Может занести все эти элементы в массив и попробовать через индексы массива их как-то перебрать?
David Villa вне форума Ответить с цитированием
Старый 08.05.2012, 10:53   #4
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Ну с длинами все понятно - просто будете делать для всех длин от 1 до N.
А буквы можно делать +1 и даже сравнивать, они же в кодировке по порядку идут, а в с++ они неотличимы от чисел.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа перебора вариантов (изменить перебор цифровой на перебор буквенный) BArt2000 Паскаль, Turbo Pascal, PascalABC.NET 5 02.03.2015 12:56
Даны два слова. Получить третье слово из неповторяющихся символов, входящих как в первое, так и во второе слова. dlinkz Паскаль, Turbo Pascal, PascalABC.NET 8 01.02.2012 11:09
формула суммы сочетаний HyperSonik Microsoft Office Excel 4 29.01.2012 02:36
Найти количество сочетаний из n по k и вывести все комбинации этих сочетаний на экран Рон99 Паскаль, Turbo Pascal, PascalABC.NET 2 14.12.2011 00:05
Восстановление сочетаний клавиш... Busine2009 Microsoft Office Word 0 28.06.2009 20:17