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

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

Подскажите алгоритм генерации текста [D7, Win2k, WinXP]


integery ©   (2007-09-10 21:47:00) 

Подскажите алгоритм  генерации текста
Например есть массив слов :  слово1, слово2, слово3

Нужно получить все возможные варианты словосочитания, но слова не должны повторятся:

слово1  слово2  слово3
слово1  слово3  слово2
слово2  слово1  слово3
слово2  слово3  слово1
…….

Массив слов может иметь от 2 до 10 слов.
Спасибо за любую информацию.


integery   (2007-09-12 10:33:00) [1]


> Efir
- спасибо !!!


Efir   (2007-09-11 19:10:00) [2]

Сделано по алгоритму Дейкстры.


> Пусть у нас есть первая перестановка (например 1234). Для
> нахождения следующей выполняем три шага. 1. Двигаясь с предпоследнего
> элемента перестановки, ищем элемент a[i], удовлетворяющий
> неравенству a[i] < a[i + 1]. Для перестановки 1234, это
> число 3, т. к. (3 < 4).
> 2. Меняем местами элемент a[i] с наименьшим элементом, который:
>
> а) находится праве a[i].
> б) является больше чем a[i].
> В нашем случае меняем 3 и 4.
> 3. Все элементы стоящие за a[i] сортируем. В нашем случем
> нужно отсортировать число 4, но это единственный элемент,
>  следовательно так его и оставляем.
>
> В результате выполнения этих трех шагов получаем следующую
> по алфавиту перестановку 1243.
> Выполнять эти шаги нужно циклически до тех пор, пока в перестановке
> не будет находится искомый в первом шаге элемент a[i], т.
>  е. пока перестановка не станет отсортированной по убыванию:
>  4321.


Efir   (2007-09-11 19:08:00) [3]

Вот тут написал, правда слегка коряво, но вроде работает.
На форме Button, Memo и UpDown с Edit'ом.

procedure TForm1.ButtonClick(Sender: TObject);
var
 Count,i,k,min,buf:integer;
 mas:array of byte;
 s:string;

 function isAnd:boolean;
 var
   j:integer;
 begin
   Result:=true;
   for j:=0 to High(mas) do
     if mas[j]<>Length(mas)-j then begin
       Result:=false;
       Break;
     end;
 end;

 procedure Sort;
 var
   x:integer;
   changed:boolean;
 begin
   repeat
     changed:=false;
     for x:=i+1 to Count-2 do
       if mas[x]>mas[x+1] then begin
         buf:=mas[x];
         mas[x]:=mas[x+1];
         mas[x+1]:=buf;
         changed:=true;
       end;
   until not changed;
 end;

begin
 Count:=UpDown.Position;
 SetLength(mas, Count);

 if Count<2 then Exit;

 for i:=0 to High(mas) do mas[i]:=i+1;

 s:='';
 for i:=0 to High(mas) do s:=s+' '+inttostr(mas[i]);
 Memo.Lines.Add(s);

 repeat
   for i:=Count-2 downto 0 do
     if mas[i]<mas[i+1] then begin
       min:=i+1;
       for k:=i+1 to Count-1 do
         if (mas[i]<mas[k]) and (mas[k]<mas[min]) then min:=k;
       if mas[i]<mas[min] then begin
         buf:=mas[i];
         mas[i]:=mas[min];
         mas[min]:=buf;
         Sort;
       end;
       Break;
     end;

   s:='';
   for i:=0 to High(mas) do s:=s+' '+inttostr(mas[i]);
   Memo.Lines.Add(s);
 until isAnd;
end;


integery   (2007-09-11 17:54:00) [4]

может ктото на дельфях может подкинуть пример.


Efir   (2007-09-11 12:08:00) [5]

Может http://progpage.narod.ru/alg/per.html


Efir   (2007-09-11 12:05:00) [6]

Виноват, не понял.


ЮЮ   (2007-09-11 11:54:00) [7]

> Ты хочешь сказать, что 10!=7 или 3?


Он хочет сказать, что ему в основном придется вращаться между 3! и 7!, а 10! - в крайнем случае :)

P.S. Автор точно уверен, что ему нужно такое количество вариантов? Кто такой манускрипт читать то будет?


Efir   (2007-09-11 11:47:00) [8]


> 10 слов ето максимум в основном 3 - 7


Ты хочешь сказать, что 10!=7 или 3?


integery   (2007-09-11 11:43:00) [9]

нужно  просто комбинации из набора слов
Нужно получить все возможные варианты комбинации, но слова не должны повторятся


integery   (2007-09-11 11:38:00) [10]


> for i := 0 to WordsCount - 1 do swapinds(i, random(WordsCount));

што за финкция swapinds ?????


Ega23   (2007-09-11 11:18:00) [11]

Уточни задачу: тебе именно "словосочетания", или просто комбинации из набора слов?
Просто вторая задачка - тривиальна, а вот первая - на хороший курсовик тянет.


integery   (2007-09-11 11:16:00) [12]

10 слов ето максимум в основном 3 - 7


Вася Правильный   (2007-09-11 10:10:00) [13]


> Неа. Рекурсия!

это продвинутый варинат для заранее неизвестного числа слов


новичёк   (2007-09-10 23:17:00) [14]

inds: array[0..WordsCount - 1];
for i := 0 to WordsCount - 1 do inds[i] := i;
for i := 0 to WordsCount - 1 do swapinds(i, random(WordsCount));
for i := 0 to WordsCount - 1 do Result := Result + Words[inds[i]];


Efir   (2007-09-10 22:46:00) [15]

Десять слов - это жесть, 3628800 комбинаций.


Dib@zol   (2007-09-10 22:14:00) [16]

Неа. Рекурсия!


Вася Правильный   (2007-09-10 22:13:00) [17]

вложенные циклы?


Наверх

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