Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2015, 13:50   #1
Ilai
Пользователь
 
Регистрация: 10.09.2014
Сообщений: 90
Восклицание Комбинаторика. Размещения

Добрый день!

Помогите пожалуйста написать программу по размещениям.
Были написаны программы для нахождения перестановок:
Код:
Program perestanovka;
const MaxN = 7;
var
  A: Array[1 .. MaxN] Of Byte;
  N, i, j, k: Byte;

Procedure Output;
var i: Byte;
begin
  For i := 1 to N do
  Write(A[i], ' ');
  Writeln;
end;

Procedure Change(i, k: Longint);
var x: Byte;
begin
  x:= A[i];
  A[i] := A[k];
  A[k] := x;
end;

begin
  ReadLn(N);
  For i := 1 to N do
  A[i] := i;
  While True Do
  Begin
    Output;
    i:= N;
    While (i > 0) and (A[i] >= A[i + 1]) do
    Dec(i);
    If i = 0 then Break;
    For j := i + 1 To N Do
    If (A[j] > A[i]) then
      k := j;
    Change(i, k);
    Inc(i);
    j := N;
    While (i < j) do
    Begin
      Change(i, j);
      Inc(i);
      Dec(j);
    end;
  end;
  readln;
end.
И программа для нахождения сочетаний:
Код:
Program sochetanie;
const
 n=5; k=3; n1=100;
type
 Mas=array[1..n1] of integer;
var
 x,a,b : Mas;
 i,j:integer;

begin
for j:=1 to k do
 begin
 b[j]:=n-j+1;
 a[j]:=k-j+1;
 x[j]:=a[j]
 end;

while i<=k do
 begin
 for j:=k downto 1 do write(x[j], ' '); writeln;
 i:=1;
 while (i<=k) and (x[i]=b[i]) do i:=i+1;
 if i<=k then x[i]:=x[i]+1;
 for j:=i-1 downto 1 do
 begin
 a[j]:= x[j+1]+1;
 x[j]:=a[j]
 end
 end;
readln;
end.
Размещение - это сочетание, в котором важен порядок.
То есть для каждого сочетания нужно найти перестановки.
Помогите, пожалуйста, на основе данных программ написать программу для нахождения размещений.

Последний раз редактировалось Ilai; 04.04.2015 в 13:53.
Ilai вне форума Ответить с цитированием
Старый 04.04.2015, 14:37   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Код:
const
 n=5; k=3; n1=100;
type
 Mas=array[1..n1] of integer;

procedure permute(A : Mas; n : Byte);
var
	i, j, k : Byte;

Procedure Output;
var i: Byte;
begin
  For i := 1 to N do
  Write(A[i], ' ');
  Writeln;
end;

Procedure Change(i, k: Longint);
var x: Byte;
begin
  x:= A[i];
  A[i] := A[k];
  A[k] := x;
end;

begin
	
  for i := 1 to N div 2 do
  	Change(i, N-i+1);
  	
  	
  While True Do
  Begin
    Output;
    i:= N;
    While (i > 0) and (A[i] >= A[i + 1]) do
    Dec(i);
    If i = 0 then Break;
    For j := i + 1 To N Do
    If (A[j] > A[i]) then
      k := j;
    Change(i, k);
    Inc(i);
    j := N;
    While (i < j) do
    Begin
      Change(i, j);
      Inc(i);
      Dec(j);
    end;
  end;
end;



var
 x,a,b : Mas;
 i,j:integer;

begin
for j:=1 to k do
 begin
 b[j]:=n-j+1;
 a[j]:=k-j+1;
 x[j]:=a[j]
 end;
i := 1;
while i<=k do
 begin
 permute(x, k); writeln;
 i:=1;
 while (i<=k) and (x[i]=b[i]) do i:=i+1;
 if i<=k then x[i]:=x[i]+1;
 for j:=i-1 downto 1 do
 begin
 a[j]:= x[j+1]+1;
 x[j]:=a[j]
 end
 end;

end.
Как-то так
Poma][a вне форума Ответить с цитированием
Старый 05.04.2015, 10:23   #3
Ilai
Пользователь
 
Регистрация: 10.09.2014
Сообщений: 90
По умолчанию

Большое спасибо!
Ilai вне форума Ответить с цитированием
Старый 05.04.2015, 16:40   #4
Ilai
Пользователь
 
Регистрация: 10.09.2014
Сообщений: 90
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Код:
const
 n=5; k=3; n1=100;
type
 Mas=array[1..n1] of integer;

procedure permute(A : Mas; n : Byte);
var
	i, j, k : Byte;

Procedure Output;
var i: Byte;
begin
  For i := 1 to N do
  Write(A[i], ' ');
  Writeln;
end;

Procedure Change(i, k: Longint);
var x: Byte;
begin
  x:= A[i];
  A[i] := A[k];
  A[k] := x;
end;

begin
	
  for i := 1 to N div 2 do
  	Change(i, N-i+1);
  	
  	
  While True Do
  Begin
    Output;
    i:= N;
    While (i > 0) and (A[i] >= A[i + 1]) do
    Dec(i);
    If i = 0 then Break;
    For j := i + 1 To N Do
    If (A[j] > A[i]) then
      k := j;
    Change(i, k);
    Inc(i);
    j := N;
    While (i < j) do
    Begin
      Change(i, j);
      Inc(i);
      Dec(j);
    end;
  end;
end;



var
 x,a,b : Mas;
 i,j:integer;

begin
for j:=1 to k do
 begin
 b[j]:=n-j+1;
 a[j]:=k-j+1;
 x[j]:=a[j]
 end;
i := 1;
while i<=k do
 begin
 permute(x, k); writeln;
 i:=1;
 while (i<=k) and (x[i]=b[i]) do i:=i+1;
 if i<=k then x[i]:=x[i]+1;
 for j:=i-1 downto 1 do
 begin
 a[j]:= x[j+1]+1;
 x[j]:=a[j]
 end
 end;

end.
Как-то так
А подскажите ещё, зачем мы делаем вот это действие?
Код:
for i := 1 to N div 2 do <--вот это
Change(i, N-i+1);
Ilai вне форума Ответить с цитированием
Старый 05.04.2015, 16:57   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Перестановка должна получать массив, упорядоченный по возрастанию.
Например, 1 2 3 4 5
Без этого цикла, массив, который мы передаем, упорядочен по убыванию (тоесть 5 4 3 2 1)
Poma][a вне форума Ответить с цитированием
Старый 05.04.2015, 17:10   #6
Ilai
Пользователь
 
Регистрация: 10.09.2014
Сообщений: 90
По умолчанию

Понял, спасибо. А это получается, то что мы только один раз заходим
for i := 1 to N div 2
=
for i := 1 to 1
Ilai вне форума Ответить с цитированием
Старый 05.04.2015, 17:12   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

При k = 3, да.
Poma][a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Карта размещения объектов Артём Волжанкин Помощь студентам 1 11.10.2014 10:19
Программа для размещения объявлений. Артём777 Помощь студентам 0 09.02.2012 02:21
Сочетания и Размещения swillrocker Помощь студентам 1 14.11.2011 03:15
План размещения в отеле Janku1983 Microsoft Office Access 3 23.09.2011 11:22
размещения fedd Помощь студентам 0 27.11.2009 22:36