RosettaCodeData/Task/Permutations/Pascal/permutations-1.pas

72 lines
848 B
ObjectPascal

program perm;
var
p: array[1 .. 12] of integer;
is_last: boolean;
n: integer;
procedure next;
var i, j, k, t: integer;
begin
is_last := true;
i := n - 1;
while i > 0 do
begin
if p[i] < p[i + 1] then
begin
is_last := false;
break;
end;
i := i - 1;
end;
if not is_last then
begin
j := i + 1;
k := n;
while j < k do
begin
t := p[j];
p[j] := p[k];
p[k] := t;
j := j + 1;
k := k - 1;
end;
j := n;
while p[j] > p[i] do j := j - 1;
j := j + 1;
t := p[i];
p[i] := p[j];
p[j] := t;
end;
end;
procedure print;
var i: integer;
begin
for i := 1 to n do write(p[i], ' ');
writeln;
end;
procedure init;
var i: integer;
begin
n := 0;
while (n < 1) or (n > 10) do
begin
write('Enter n (1 <= n <= 10): ');
readln(n);
end;
for i := 1 to n do p[i] := i;
end;
begin
init;
repeat
print;
next;
until is_last;
end.