Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.01;
Скачать: CL | DM;

Вниз

Перетосовщик Букв Помогите !   Найти похожие ветки 

 
Sycho ©   (2007-06-10 20:26) [0]

Я пытался понять как это можно реализовать , но всё-же не додумался , видимо думать не умею...
А смысл таков , например в Эдит Бокс вводится слово ,а в рядом стоящий Мемо выдаются все вариации перетосованных букв этого слова!
Знаю что больше 6-7 букв делать не стоит так как счёт будет на миллионы !

Вобщем помогите с алгоритмом !
Спасибо большое !


 
Однокамушкин   (2007-06-10 22:01) [1]

procedure TForm1.Commutations(Mask:string;const Letters:string);
var
 I:Integer;
begin
 for I := 1 to Length(Mask) do
   if Mask[I] = " " then
   begin
     Mask[I] := Letters[1];
     if Length(Letters) = 1 then
       Memo1.Lines.Add(Mask)
     else
       Commutations(Mask, Copy(Letters, 2, MaxInt));
     Mask[I] := " ";
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 I: Integer;
 S: string;
begin
 Memo1.Lines.Clear;
 SetLength(S, Length(Edit1.Text));
 for I := 1 to Length(S) do
   S[I] := " ";
 Commutations(S, Edit1.Text);
end;


Вкратце смысл такой - процедура Commutatuins рекурсивна, первым параметром ей передаётся уже сформированная часть строки, вторым - оставшиеся буквы... в параметре Mask стоят в тех местах, где символы ещё не определены... функция, получив маску и оставшиеся буквы, берёт первую букву из оставшихся и по очереди подставляет во все те позиции строки Mask, где стоят пробелы... если это последняя из оставшихся букв, после такой подстановки мы получаем одну из требуемых комбинаций, если нет, функция рекурсивно вызывает сама себя, передавая строку, в которой соответствующая позиция занята, а из списка оставшихся букв убирается одна... соответственно, запускать эту функцию надо так, чтобы первый параметр содержал нужное число пробелов, а второй - слово, буквы в котором надо переставить...

алгоритм написан для простейшего случая, когда все буквы разные, т.е. для слова АНАНАС он выдаст 6!=720 комбинаций, хотя из-за трёх букв А и двух букв Н на самом деле их будет 6!/3!/2!=60... кроме того, код не оптимизирован, за пределы цикла не вынесено вычисление его инвариантов Letters[1] и Copy(Letters, 2, MaxInt), но это уж вы сами...

И насчёт миллионов вы немножко промахнулись, миллионы начинаются только с 10 букв, для 9 будет всего 362880 комбинаций...


 
Sycho ©   (2007-06-11 02:06) [2]

Спасибо большое сейчас попробуем !


 
Ega23 ©   (2007-06-11 10:35) [3]

А как Вам объясняли это на семинаре?


 
Sycho ©   (2007-06-11 11:26) [4]

А вы про какие семинары говорите ?
Всё что я знал о Делфи , и что благополучно улетучилось из моей головы идёт от скаченных электронных книг в Иннете !


 
G_M_S ©   (2007-06-11 15:24) [5]

Оффтоп:
Эксепшен от перетосовщика буков: "EМногаБукавНиасилил" :)))



Страницы: 1 вся ветка

Текущий архив: 2007.07.01;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
15-1180421473
Loginov Dmitry
2007-05-29 10:51
2007.07.01
Зачем нужны антивирусы?


3-1175695429
Jorik
2007-04-04 18:03
2007.07.01
Как создать базу данных из имеющихся массивов


1-1178165959
Novice
2007-05-03 08:19
2007.07.01
Скорость TCheckListBox


2-1181354671
Solbon
2007-06-09 06:04
2007.07.01
ftp


11-1164289862
Psychedelic
2006-11-23 16:51
2007.07.01
Unit mirror was compiled with a different version of KOL.TOnChar