С
праздничком! В этом выпуске предлагаем вам ещё
два решения задачи "Перестановки" из 9-го
выпуска рассылки.
Перестановки (3 уровень)
Условие:
Даны n чисел в произвольном порядке. Вывести
на экран всевозможные их перестановки.
Решение: (by Antrax <antrax@mail.nnov.ru>)
{Реккурсивный алгоритм перестановок...}
program Perest;
type m=array[1..200] of integer;
var
a,b:m;
i,n:integer;
procedure ChangePrint;
var
i:integer;
begin
for i:=1 to n do write(b[a[i]]:3);
writeln
end;
procedure swap(var x,y:integer);
var
k:integer;
begin
k:=x;
x:=y;
y:=k
end;
procedure Change(n:integer);
var
i:integer;
begin
if n=1 then ChangePrint
else
begin
change(n-1);
for i:=1 to n-1 do
begin
swap(a[n],a[i]);
Change(n-1);
swap(a[n],a[i])
end
end
end;
begin
write('Введите количество чисел:');
readln(n);
write('Введите числа:');
for i:=1 to n do read(b[i]);
for i:=1 to n do a[i]:=i;
writeln('Перестановки:');
Change(n);
readln
end.
*********************
{Итеративный аглоритм перебора}
program change;
const nmax=100;
var
a,b:array[1..nmax] of integer;
i,n:integer;
procedure Perest;
var
i:integer;
r,l,q,p:integer;
begin
for i:=1 to n do
a[i]:=i;
for i:=1 to n do
write(b[a[i]]:3);
writeln;
repeat
l:=n-1;
while (l>=1) and (a[l]>a[l+1]) do
dec(l);
if l>0 then
begin
p:=l+1;
q:=n;
while p<q do
begin
r:=a[q];
a[q]:=a[p];
a[p]:=r;
inc(p);
dec(q)
end;
for i:=l+1 to n do
if a[l]<a[i] then
begin
r:=a[l];
a[l]:=a[i];
a[i]:=r;
break
end;
for i:=1 to n do
write(b[a[i]]:3);
end;
writeln;
until l=0;
end;
begin
write('Введите количество чисел:');
readln(n);
write('Введите числа:');
for i:=1 to n do read(b[i]);
readln;
for i:=1 to n do a[i]:=i;
perest;
readln;
end.
Реклама
в рассылке:
Рассылки проекта Sapisoft:
Всегда
рады видеть Вас на нашем сайте. Жду ваших
предложений и замечаний, Шамис Алексей