![]() |
|
|
![]()
|
|
| Resident |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 25.9.2006 Репутация: нет Всего: 0 |
На входе задается строка
1|2|3|4 5|6|7|8 из нее формируется массив Array ( [0] => Array ( [0] => 1 [1] => 5 ) [1] => Array ( [0] => 2 [1] => 6 ) [2] => Array ( [0] => 3 [1] => 7 ) [3] => Array ( [0] => 4 [1] => 8 ) ) Принцип генерации я думаю понятен, каждая колонка собирается в отдельный массив. Колонок может быть больше, может быть меньше. Т.е. не фиксировано 4шт. Так же строк может быть одна и более. В соответствии с полученной на входе строкой формируется соответствующий многомерный массив. Далее нужно перебрать все возможные комбинации по принципу кодового замка с барабанами, которые нужно крутить. На выходе для приведенного выше массива должны получиться комбинации: 1234 1238 1274 1278 1634 1638 1674 1678 5234 5238 5274 5278 5678 5638 5674 5678 Как такое можно сделать? Это сообщение отредактировал(а) Resident - 29.10.2009, 18:45 |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Тут две задачи - формирование масссива и вывод перестановок.
Какая вызывает проблемы? PS. Обе неоднократно обсуждались в форуме. Поиск поможет. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Resident |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 25.9.2006 Репутация: нет Всего: 0 |
C формированием массива проблем нет. Проблема как раз с перебором всех возможных значений из получившегося массива, как описано выше.
|
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
При неизвестном количестве элементов - рекурсия или псевдорекурсия.
Поиск по форуму поможет. Если на поиск не хватит таланта - то хотя бы см. темы в самом низу этой страницы. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Alexk553 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 8.11.2009 Репутация: нет Всего: нет |
Недавно для себя решил подобную задачу. на входе есть массив строк, например, из 30 строк. Задача - составить все возможные их комбинации с повторами, начиная с одной строки, потом две строки, потом три, и.т.д. Результирующая строка куда-то там выводится. Рекурсию я отверг, потому что лёгкость алгоритма рекурсии нивелируется сложностью восстановления вычислений. например, мы перебрали 10000000000 комбинаций, и требуется перезагрузить машину. Поэтому никаких рекурсий, только итерации.
Реализуется просто: главное - это число - итератор. его тип лучше брать целое , 64 или 128 битное. В Си++ это __int64 или, если позволяет архитектура, __int128. пишем стандартный цикл с инкрементированием. в теле цикла организуем другой цикл, где делим итератор нацело на число элементов в массиве, например, на 30. запоминаем последовательность. когда результат деления ноль, записываем остаток. например итератор - последовательность (делим на 30). 15 - 0,15 45 -1,15 46 - 1, 16 31 - 1, 1 и.т.д. эта последовательность есть индексы массива. очевидно, что таким образом будут перебираться все возможные сочетания элементов друг с другом. преимущество - быстрота, запоминание результата. в отличие от рекурсии не тратится время на занесение в стек. На core2 duo 3 GHz в однопоточном варианте сама вычислительная часть перебирала 20 000 000 комбинаций в секунду. моя задача проще, но я показываю, что можно обойтись и без рекурсии. В данном случае массив чётко задаёт последовательность на выходе, а значит, существует итератор, который однозначно определяет комбинацию. для адаптации описанного выше япод эту задачу я бы сделал так. число строк (в приведённом автором примере их две) - это число элеметов в массиве. а вот отличие в том, что в моём примере индекс был для линейного массива, а тут во внутреннем цикле (где идёт деление нужно его инкремент хзапоминать для каждого акта деления, это будет вторым индексом для обращения к двумерному массиву). Удачного взлома! Это сообщение отредактировал(а) Alexk553 - 14.1.2010, 13:39 |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |