Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

алгоритм


aids ©   (2007-10-09 23:03:00) 

возможно не по теме но может быть кто то мне поможет...

вообще м у меня такая задача:
дана последовательность 4 3 2 1  - все цифры входят только один раз
надо получить все перестановки вида: 4 3 2 1 - 4 2 3 1 - 4 1 3 2
т.е элементы индексы которых нечетные(1,3,...) должны быть больше своих соседей на четных индексах.

а написал прогу которая получает все перестановки

нерекурсивную:

procedure Next;
   begin
     {найти i: X[i]<M,X[i+1]=M,...,X[N]=M};
     X[i]:=X[i]+1;
     X[i+1]:=...:=X[N]:=1
   end;

program Sequences;
     type Sequence=array [byte] of byte;
     var M,N,i:byte;
  X:Sequence;
  Yes:boolean;
     procedure Next(var X:Sequence;var Yes:boolean);
var i:byte;
     begin
i:=N;
{поиск i}
while (i>0)and(X[i]=M) do begin X[i]:=1;dec(i) end;
if i>0 then begin inc(X[i]);Yes:=true end
else Yes:=false
     end;
   begin
     write('M,N=');readln(M,N);
     for i:=1 to N do X[i]:=1;
     repeat
for i:=1 to N do write(X[i]);writeln;
Next(X,Yes)
     until not Yes
   end.


и рекурсивную

procedure Generate(k:byte);
    var i,j:byte;
  begin
    if k=N then
      begin for i:=1 to N do write(X[i]);writeln end
    else
      for j:=1 to M do
 begin X[k+1]:=j; Generate(k+1) end
  end;

program SequencesRecursion;
  type Sequence=array [byte] of byte;
  var M,N:byte;
      X:Sequence;
  procedure Generate(k:byte);
       ............
begin
  write('M,N=');readln(M,N);
  Generate(0) end.

подскажте как переделать чтобы выдавались лишь нужные мне последовательности

П.С : последовательности вида 4 3 2 1 и 2 1 4 3 - считать одинаковыми и выдавать лишь одну из них


MBo   (2007-10-10 16:12:00) [1]

>в условии задачи ограничение на длину последовательности от 1 до 5000
формулу для количества перестановок я уже привел, так что интересно будет посмотреть на процесс получения и вывода 4.5*10^15569 перестановок :)


aids   (2007-10-10 15:42:00) [2]

>Anatoly Podgoretsky цифры и числа разные вещи...

ну так что не подскажите?

MBo> в условии задачи ограничение на длину последовательности от 1 до 5000


MBo   (2007-10-10 09:24:00) [3]

Молодец преподаватель, дал задачку, решение которой не висит на каждом углу в инете, и надо самому думать :)

>последовательности будут большими до 5000 элементов
Это вряд ли, т.к. количество перестановок будет расти очень быстро, например, для N = 12 их будет уже 1247400.

P(N) = (N - 1)! / 2^((N - 1) div 2)


Германн   (2007-10-10 01:40:00) [4]

Да и кстати

> write('M,N=');readln(M,N);

это не для пользователей программы. Они на это не способны.
Это для "неумного препода" :-)


Anatoly Podgoretsky   (2007-10-10 01:37:00) [5]

> aids  (10.10.2007 01:23:05)  [5]

Ну не может быть больше 10 цифр!


Германн   (2007-10-10 01:29:00) [6]


> aids   (10.10.07 01:23) [5]
>
> >Германн ©
>
> цифры только арабские
>

Тогда постановка задачи не правильная. Так как на сей вопрос отвечать? Флудом? Так это нам не влом. Только дай знак! :-)


aids   (2007-10-10 01:23:00) [7]

>Германн ©

цифры только арабские

> Anatoly Podgoretsky © решение  1 2 3 4 - тривиально, тяжелее с большими последовательностями


Anatoly Podgoretsky   (2007-10-10 01:06:00) [8]

> aids  (10.10.2007 00:18:02)  [2]

А надо правильно задавать вопрос, он сначала был про 1 2 3 4


Германн   (2007-10-10 00:58:00) [9]


> последовательности будут большими до 5000 элементов...


> все цифры входят только один раз

Это как?
Или помимо римских и арабских цифр есть ещё какие-то цифры, про которые я ничего не знаю?


aids   (2007-10-10 00:18:00) [10]

то есть? последовательности будут большими до 5000 элементов...
очень важно сократить вычисления


Anatoly Podgoretsky   (2007-10-09 23:13:00) [11]

> aids  (09.10.2007 23:03:00)  [0]

Можно построить множества и сравнивать их.


Наверх

Титульная страница Поиск, карта сайта Написать письмо