Unkind писал(а):
мне нужно получить все варианты перестановок
Генератор перестановок на языке АЛГОЛ-60. Переведите на любой современный язык программирования и пользуйтесь.
Код:
procedure perm(n) dataresult:(x);
value n; integer n; array x;
begin real t;integer k,q; own integer array p,d[2:n];
if prim115 then
begin prim115:=false;
for k:=2 step 1 until n do
begin p[k]:=0; d[k]:=1 end k
end prim115;
k:=0
index: p[n]:=q:=p[n]+d[n];
if q=n then
begin d[n]:=-1; go to iter end;
if q≠0 then go to trans;
d[n]:=1; k:=k+1;
iter: if n>2 then
begin n:=n-1; go to index end iter;
q:=1; prim115:=true;
trans: q:=q+k;t:=x[q];
x[q]:=x[q+1];x[q+1]:=t
end perm;
Массив x, содержащий не менее n элементов, содержит текущую перестановку и не должен изменяться между обращениями к процедуре. При каждом обращении процедура вычисляет следующую перестановку.
Глобальная переменная prim115 при первом обращении должна иметь значение true. После первого обращения она принимает значение false и сохраняет это значение до конца n!-го обращения к процедуре perm. К этому моменту массив x восстанавливается в первоначальном порядке, а prim115 принимает значение true.
Описатель own определяет локальные величины, которые сохраняются при выходе из процедуры, и при следующем входе процедура может использовать значения, полученные при предыдущем обращении.
М.И.Агеев, В.П.Алик, Ю.И.Марков. Библиотека алгоритмов 101б - 150б. Москва, "Советское радио", 1978.