![]() |
#31 |
Участник
|
перестановки: Всё гениальное - простынь)
Произвольную перестановку можно представить в виде суперпозиции транспозиций соседних элементов. [[Липский] Комбинаторика_для программистов.] Т.е. достаточно n! раз последовательно попарно переставить соседние элементы: X++: #define.CONDATA([' a', ' b', ' c']) static void Transpositions(Args _args) { Container con = #CONDATA; Int pos = 1, len = conlen(con), transCount = factorial(len); boolean anyMoreTrans() {; transCount--; return transCount; } void swap(int _i, int _j) { AnyType tmp = conpeek(con, _i); ; con = conpoke(con, _i, conpeek(con, _j)); con = conpoke(con, _j, tmp); } void swapNextPair() { Int nextPos = (pos == len) ? 1 : pos+1; ; swap(pos, nextPos); pos = nextPos; } ; setprefix("Перестановки:"); info(con2Str(con)); while (anyMoreTrans()) { swapNextPair(); info(con2Str(con)); } } |
|
|
За это сообщение автора поблагодарили: ivas (1). |