По исходной перестановке вывести все циклы, которые в ней есть, в лексикографическом порядке - Pascal ABC
Формулировка задачи:
Решение задачи: «По исходной перестановке вывести все циклы, которые в ней есть, в лексикографическом порядке»
Program Prg59;
Const NMAX = 100;
Var P1,P2 : Array[1..NMAX] of integer;
Var i,n : integer;
Procedure NextLoop(Var P,R : Array[1..NMAX] of integer; n : integer);
Var i,k,u,v : integer;
Begin
for i:=1 to n Do R[i]:=0;
k:= 0;
For i:= 1 To n Do
If P[i] <> 0 Then Begin
k:=i;
break;
End;
If k= 0 Then Exit;
v:=1;
R[1]:=k;
While (True) Do Begin
u:=P[k];
P[k]:=0;
If R[1]=u Then exit;
v:=v+1;
R[v]:=u;
k:=u;
End;
End;
Begin
write('n=');
readln(n);
write('Enter permutation: ');
for i:=1 to n do read(P1[i]);
While (true) Do begin
NextLoop(P1,P2,n);
if P2[1]=0 Then break;
write('(');
for i:=1 to n do
if P2[i]<>0 then write(P2[i]) else break;
writeln(')');
End;
Writeln('OK');
End.
Объяснение кода листинга программы
Программа Prg59 выводит все циклы в исходной перестановке, используя язык программирования Pascal ABC. Константа NMAX определяет максимальное количество элементов в массиве (до 100). Два массива P1 и P2 используются для хранения исходной и преобразованной перестановок соответственно. Переменные i и n представляют собой текущий элемент и количество элементов в перестановке соответственно. Процедура NextLoop выполняет следующий шаг в цикле: она обнуляет все элементы массива R, начиная с первого элемента, затем находит первый ненулевой элемент в массиве P и помещает его в начало массива R. Если такой элемент не найден, процедура завершается. Цикл while выполняется до тех пор, пока R[1] не станет равным нулю. На каждой итерации цикла while происходит чтение следующего элемента из массива P1, обнуление всех элементов массива R, начиная с первого элемента, и поиск первого ненулевого элемента в массиве P для помещения в начало массива R. Если R[1] становится равным нулю, цикл while завершается и программа переходит к следующему циклу while. В конце программы пользователю предлагается ввести число n, а затем программа запрашивает исходную перестановку. Затем происходит вывод преобразованной перестановки в лексикографическом порядке.