По исходной перестановке вывести все циклы, которые в ней есть, в лексикографическом порядке - Pascal ABC

Узнай цену своей работы

Формулировка задачи:

Перестановкой π порядка n называется последовательность из n попарно различных целых положительных чисел p1, p2, ... , pn, где каждое 1 <= pi <= n. Результатом применения перестановки π к 1 является число p1, аналогично π(2)=p2. Последовательность 1, π(1), π(π(1)),…назовём орбитой элемента 1. Понятно, что орбита любого элемента всегда является циклической. Из теории перестановок известно, что любая перестановка однозначно раскладывается в произведение циклов. Требуется составить программу, которая по исходной перестановке выводит все циклы, которые в ней есть в лексикографическом порядке. Формат входного файла Первая строка входного файла содержит целое число n - количество элементов перестановки (1 ≤ n ≤ 10000). Вторая строка содержит n целых чисел, образующих данную перестановку, разделённых пробелами. Формат выходного файла Выведите в первую строку выходного файла одно число - количество циклов в данной перестановке. Во второй строке необходимо вывести все циклы, имеющиеся в данной перестановке. Каждый цикл заключается в круглые скобки, должен начинаться со своего минимального элемента, после которого через один пробел перечисляются остальные элементы цикла. Пробелы перед скобками и после скобок ставить не нужно. Циклы перечисляются в порядке возрастания минимальных элементов. Примеры Input.txt Output.txt 5 5 1 2 3 4 5 (1)(2)(3)(4)(5) Помогите в реализации!

Решение задачи: «По исходной перестановке вывести все циклы, которые в ней есть, в лексикографическом порядке»

textual
Листинг программы
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, а затем программа запрашивает исходную перестановку. Затем происходит вывод преобразованной перестановки в лексикографическом порядке.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.667 из 5
Похожие ответы