![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Tri |
![]()
Сообщение
#1
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 94 Регистрация: 26.10.2007 Город: Тюмень Учебное заведение: ТГНГУ Вы: студент ![]() |
Есть вот такая задача:
Цитата Напишите программу для определения при разных значениях n числа перестановок PI=(pi 1,pi 2,…,pi n) на множестве {1,2,…n}, которые обладают тем свойством, что из pi i- i = pi j-j (mod n) следует i=j. Я не совсем понимаю как реализовать условие, и что должно получиться. Подскажите, пожалуйста, решение. Вот такие наработки: Код { программа генерации перестановок N элементного множества в лексикографическом порядке } Program perms; var i, j, h, n, k, x, y: integer; a:array[0 .. 100] of integer; { массив для хранения перестановки } {процедура вывода полученной перестановки} procedure output; var i: integer; begin writeln; for i:=1 to n do write(a[i],' '); end; begin write('количество элементов перестановки: '); readln(n); fillchar(a, sizeof(a), 0); { ввод элементов начальной перестановки } for i:=1 to n do a[i]:=i; i:=n; j:=i; repeat //здесь пытаюсь проверить условие (не уверена, что оно вообще здесь должно быть) x:= a[i]-i; y:=a[j]-j mod n; if (x=y) and (i=j) then output; { вывод текущей перестановки } i:=n; while a[i-1]>a[i] do dec(i); { поиск скачка } j:=i-1; h:=a[j]; while a[i+1]>h do inc(i); { поиск первого меньшего элемента } a[j]:=a[i]; a[i]:=h; i:=j+1; k:=n; while i<k do begin { перестановка ”хвоста” } h:=a[i]; a[i]:=a[k]; a[k]:=h; inc(i); dec(k) end until j=0; end. Заранее большое спасибо! |
![]() ![]() |
creer |
![]()
Сообщение
#2
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 121 Регистрация: 28.10.2007 Город: Екатеринбург Учебное заведение: УГТУ-УПИ Вы: студент ![]() |
Я добавил одну функцию в программу, которая для каждой позиции проверяет то, что я описывал выше. Посмотрите (IMG:style_emoticons/default/smile.gif)
Код { программа генерации перестановок N элементного множества в лексикографическом порядке } Program perms; var i, j, h, n, k, count: integer; a:array[0 .. 100] of integer; { массив для хранения перестановки } {процедура вывода полученной перестановки} procedure output; var i: integer; begin writeln; for i:=1 to n do write(a[i],' '); end; function testposition:boolean; var ta:array [0..100] of boolean; i: integer; begin fillchar(ta, sizeof(ta), false); for i:=1 to n do begin if (ta[(a[i] - i + n) mod n] = false) then ta[(a[i] - i + n) mod n]:=true else begin Result:=false; Exit; end; Result:=true; end; end; begin write('количество элементов перестановки: '); readln(n); fillchar(a, sizeof(a), 0); count:=0; { ввод элементов начальной перестановки } for i:=1 to n do a[i]:=i; i:=n; j:=i; repeat //output; { вывод текущей перестановки } if testposition then inc(count); i:=n; while a[i-1]>a[i] do dec(i); { поиск скачка } j:=i-1; h:=a[j]; while a[i+1]>h do inc(i); { поиск первого меньшего элемента } a[j]:=a[i]; a[i]:=h; i:=j+1; k:=n; while i<k do begin { перестановка "хвоста" } h:=a[i]; a[i]:=a[k]; a[k]:=h; inc(i); dec(k) end until j=0; writeln(count); readln; end. |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 26.5.2025, 0:57 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru