Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Перестановки

Автор: Triplet 29.09.2008 0:32

Есть вот такая задача:

Цитата
Напишите программу для определения при разных значениях n числа перестановок PI=(pi 1,pi 2,…,pi n) на множестве {1,2,…n}, которые обладают тем свойством, что из pi i- i = pi j-j (mod n) следует i=j.

Я не совсем понимаю как реализовать условие, и что должно получиться.
В FAQ нашла код получения перестановок, попробовала туда поставить это условие, но получается откровенная ерунда.
Подскажите, пожалуйста, решение.

{ программа генерации перестановок 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.

Заранее спасибо!

Автор: klem4 7.10.2008 10:45

Приведите несколько примеров исходных данных и получившихся из них перестановок, не очень понятно о чем идет речь.

Типа:

1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2

?