Я прочитал другие ответы, и я считаю, что они лучше, чем мои для вашей конкретной проблемы. Однако я отвечаю в случае, если кто-то нуждается в обобщенном решении вашей проблемы.
Мне недавно нужно было сгенерировать все перестановки трех отдельных непрерывных диапазонов [first1, last1) + [first2, last2) + [first3, last3). Это соответствует вашему случаю, когда все три диапазона имеют длину 1 и разделены только одним элементом. В моем случае единственным ограничением является то, что расстояние (first3, last3)> = distance (first1, last1) + distance (first2, last2) (что, я уверен, можно было бы смягчить с помощью более вычислительных затрат).
Мое приложение должно было генерировать каждую уникальную перестановку, но не ее обратную. Код здесь:
http://howardhinnant.github.io/combinations.html
И конкретная применимая функция combine_discontinuous3 (которая создает комбинацию), и его использование в reversible_permutation :: оператора(), который создает перестановку.
Это не готовое упакованное решение для вашей проблемы. Но это набор инструментов, который можно использовать для решения обобщений вашей проблемы. Опять же, для вашей простой простой проблемы, я рекомендую более простые решения, которые другие уже предложили.
Так что я должен создать следующий массив {0, 2, 4} и использовать его, когда вернувшие сгенерированные перестановки обратно в число? –
Просто поместите '{2,4,5}' в массив. Я разместил образец кода. (Хорошее упражнение;) –