Текущий архив: 2007.10.07;
Скачать: CL | DM;
Вниз
Подскажите алгоритм генерации текста Найти похожие ветки
← →
integery (2007-09-10 21:47) [0]Подскажите алгоритм генерации текста
Например есть массив слов : слово1, слово2, слово3
Нужно получить все возможные варианты словосочитания, но слова не должны повторятся:
слово1 слово2 слово3
слово1 слово3 слово2
слово2 слово1 слово3
слово2 слово3 слово1
…….
Массив слов может иметь от 2 до 10 слов.
Спасибо за любую информацию.
← →
Вася Правильный (2007-09-10 22:13) [1]вложенные циклы?
← →
Dib@zol © (2007-09-10 22:14) [2]Неа. Рекурсия!
← →
Efir © (2007-09-10 22:46) [3]Десять слов - это жесть, 3628800 комбинаций.
← →
новичёк (2007-09-10 23:17) [4]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]];
← →
Вася Правильный (2007-09-11 10:10) [5]
> Неа. Рекурсия!
это продвинутый варинат для заранее неизвестного числа слов
← →
integery (2007-09-11 11:16) [6]10 слов ето максимум в основном 3 - 7
← →
Ega23 © (2007-09-11 11:18) [7]Уточни задачу: тебе именно "словосочетания", или просто комбинации из набора слов?
Просто вторая задачка - тривиальна, а вот первая - на хороший курсовик тянет.
← →
integery (2007-09-11 11:38) [8]
> for i := 0 to WordsCount - 1 do swapinds(i, random(WordsCount));
што за финкция swapinds ?????
← →
integery (2007-09-11 11:43) [9]нужно просто комбинации из набора слов
Нужно получить все возможные варианты комбинации , но слова не должны повторятся
← →
Efir © (2007-09-11 11:47) [10]
> 10 слов ето максимум в основном 3 - 7
Ты хочешь сказать, что 10!=7 или 3?
← →
ЮЮ © (2007-09-11 11:54) [11]> Ты хочешь сказать, что 10!=7 или 3?
Он хочет сказать, что ему в основном придется вращаться между 3! и 7!, а 10! - в крайнем случае :)
P.S. Автор точно уверен, что ему нужно такое количество вариантов? Кто такой манускрипт читать то будет?
← →
Efir © (2007-09-11 12:05) [12]Виноват, не понял.
← →
Efir © (2007-09-11 12:08) [13]Может http://progpage.narod.ru/alg/per.html
← →
integery (2007-09-11 17:54) [14]может ктото на дельфях может подкинуть пример.
← →
Efir © (2007-09-11 19:08) [15]Вот тут написал, правда слегка коряво, но вроде работает.
На форме 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;
← →
Efir © (2007-09-11 19:10) [16]Сделано по алгоритму Дейкстры.
> Пусть у нас есть первая перестановка (например 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.
← →
integery (2007-09-12 10:33) [17]
> Efir
- спасибо !!!
Страницы: 1 вся ветка
Текущий архив: 2007.10.07;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.03 c