По исходной перестановке вывести все циклы, которые в ней есть, в лексикографическом порядке - 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
Листинг программы
  1. Program Prg59;
  2.  
  3. Const NMAX = 100;
  4.  
  5. Var P1,P2 : Array[1..NMAX] of integer;
  6. Var i,n   : integer;
  7.  
  8. Procedure NextLoop(Var P,R : Array[1..NMAX] of integer; n : integer);
  9.  
  10. Var i,k,u,v : integer;
  11.  
  12. Begin
  13.  
  14.      for i:=1 to n Do R[i]:=0;
  15.  
  16.      k:= 0;
  17.      
  18.      For i:= 1 To n Do
  19.          If P[i] <> 0 Then Begin
  20.             k:=i;
  21.             break;
  22.          End;
  23.  
  24.      If k= 0 Then Exit;
  25.      
  26.      v:=1;
  27.      R[1]:=k;
  28.      
  29.      While (True) Do Begin
  30.         u:=P[k];
  31.         P[k]:=0;
  32.         If R[1]=u Then exit;
  33.         v:=v+1;
  34.         R[v]:=u;
  35.         k:=u;
  36.      End;
  37.      
  38. End;
  39.  
  40. Begin
  41.  
  42.      write('n=');
  43.      readln(n);
  44.      write('Enter permutation: ');
  45.      
  46.      for i:=1 to n do read(P1[i]);
  47.      
  48.      While (true) Do begin
  49.      
  50.          NextLoop(P1,P2,n);
  51.          
  52.          if P2[1]=0 Then break;
  53.          
  54.          write('(');
  55.          for i:=1 to n do
  56.              if P2[i]<>0 then write(P2[i]) else break;
  57.          writeln(')');
  58.          
  59.       End;
  60.      
  61.       Writeln('OK');
  62.      
  63. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы