Реферат: Генерация комбинаторных объектов
i=N
Пока (i>0) и (B[i]>=B[i+1]), i=i-1
Если i=0 то конец работы
Для j от i+1 до N
если B[j]>B[i] то K=j
Обмен значений B[i] и B[k]
Для j от i+1 до (i+ ((N+1-i) div 2))
Обмен значений B[j] и B[N+i+1-j]
Вывод текущей перестановки B
Понятно, что цикл попарных перестановок "хвоста" массива B нельзя делать от i+1 до N-го элемента - иначе элементы поменяются местами по 2 раза - и получиться, что ничего не изменилось. Цикл нужно выполнить для половины этого "хвоста". Этому и служит несколько сложное для понимания значение конечной переменной цикла: i+ (N+1-i) div 2
Ниже приводится программа, генерирующая все перестановки из N компонент, обозначенных N первыми буквами латинского алфавита.
const
alphabet : string[26] = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var
b : array [1..100] of byte ;
N,i,j,k : byte;
Procedure SwapB(i,k:byte);
var x : byte;
begin
x:=B[i]; B[i]:=B[k]; B[k]:=x;
end;
Procedure WriteB;
begin
for i:=1 to N do write({alphabet[b[i]]);
writeln;
end;
begin
readln(N);
for i:=1 to N do b[i]:=i;