Реферат: Генерация комбинаторных объектов

i:=N;

while (i>0) and (B[i]>=B[i+1]) do i:=i-1;

if i=0 then exit;

for j:=i+1 to N do

if (B[j]>B[i]) then K:=j;

SwapB(B,i,k);

for j:=i+1 to (i+ ((N+1-i) div 2)) do SwapB(B,j,N+i+1-j);

WriteB(B);

end;

end;

begin

readln(N,M);

for i:=1 to M do b[i]:=i;

PermuteAll(B,M);

while (true) do

begin

i:=M;

while (i>0) and (b[i]=N-m+i) do Dec(i);

if i=0 then exit;

Inc(B[i]);

for j:=i+1 to M do B[j]:=B[j-1]+1;

PermuteAll(B,M);

end;

readln;

end.

Пояснения к программе:

1. Главная программа вводит числа N, M и генерирует по описанному выше алгоритму все сочетания из N по M. Для каждого построенного в векторе B сочетания вызывается процедура PermuteAll, которой в качестве параметров передаются текущее сочетание B и количество элементов в нем M. Процедура PermuteAll генерирует для полученного сочетания все возможные перестановки.

2. Массив B передается в процедуру PermuteAll по значению (при объявлении процедуры при параметре B нет ключевого слова VAR) и потому изменения массива B в процедуре PermuteAll не влияют на содержимое массива B в главной программе.

3. В то же время для того, что бы процедура SwapB могла обменивать значения в B и возвращать измененный массив в вызывающую ее процедуру PermuteAll, массив B добавлен в параметры процедуры SwapB с передачей по адресу - используя ключевое слово VAR.

К-во Просмотров: 395
Бесплатно скачать Реферат: Генерация комбинаторных объектов