Цитата:
Сообщение от
avf
перестановки: Всё гениальное - простынь)
Произвольную перестановку можно представить в виде суперпозиции транспозиций соседних элементов. [[Липский] Комбинаторика_для программистов.] Т.е. достаточно n! раз последовательно попарно переставить соседние элементы:
Хм... Не плохой вариант, основной недостаток - алгоритм не работает для n>3

.
Цитата:
Сообщение от
dn
Ещё один вариант...
X++:
BMRandom bmrandom = new bmRandom();
container a = ['a','b','c','d'];
container b;
.......
while (result.elements() < N);
Ура! Это решение вроде как работает для всех n!
Единственный серьезный минус - количество проходов цикла. В лучшем случае цикл делает в 2 раза больше проходов, чем нужно для поиска всех перестановок. У меня этот алгоритм выдал следующие результаты:
- Для n = 3 количество решений 6, количество проходов цикла 12
- Для n = 5 количество решений 120, а количество проходов цикла уже 696

И еще желательно в решении не используются нестандартные типы данных: контейнер, множество. Лучше все-таки обойтись стандартными типами данных - целые и вещественные числа, строки, а так же их массивы.
Небольшая оптимизация цикла и используемых типов данных - и решение получится идеальным

.