![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите алгоритм генерации текста [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]вложенные циклы?