Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2014, 21:40   #1
Nockola
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 13
По умолчанию Алгоритм всех вариантов текста

Всем привет.

Создаю алгоритм перебора всех вариантов расположения букв в Edit1.text, только не могу домыслить его.

Суть такая, есть Edit1 и в нём текст "1234". Надо вывести в Memo1 все варианты перебора символов, например:
1234
4123
3412
2341
1324
1342
...

Подскажите пожалуйста =) как сделать такой перебор, чтобы все возможные варианты он перебрал. Сам ломаю голову второй день..

Вот что я пытался сделать, но что-то где-то не то.

Код:
var
s:string;   i1:integer;   a,b:char;
begin
memo1.Clear;
s:=Edit1.Text;

for i1 := 1 to 4 do
        begin
          a:=s[i1]; b:=s[i1+1];
          if i1>1 then
          if i1<>4 then begin s[i1]:=b; s[i1+1]:=a; end else begin a:=s[i1]; b:=s[1]; s[i1]:=b; s[1]:=a; end;
          Memo1.Lines.Add(s);
        end;
    end;
end;
Nockola вне форума Ответить с цитированием
Старый 30.01.2014, 22:18   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот
Combine_src.rar
Combine_EXE.rar

суть решения в рекурсивном вызове.

вот само решение:
Код:
implementation
{$R *.dfm}
var
  a1,a2 : string;


(* Переборщик строк     v1.0 by B_SA (Specailly for Nataly & Juliy) *)
procedure TForm5.ShowVariant(S0,S1 : string);
var I :byte;
begin
  if length(S1)=1 then begin Memo1.Lines.Append(S0+S1); Exit end;
  a1 := '';
  a2 :=  copy(S1,I+1,length(S1));
  for i:=1 to length(S1) do ShowVariant(S0+S1[i],copy(S1,1,I-1)+
                             copy(S1,I+1,length(S1)));
end;

procedure TForm5.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Clear;
  ShowVariant('',Edit1.Text)
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.01.2014, 22:30   #3
Nockola
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 13
Хорошо

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
вот
Вложение 65794
Вложение 65795

суть решения в рекурсивном вызове.

вот само решение:
Код:
implementation
{$R *.dfm}
var
  a1,a2 : string;


(* Переборщик строк     v1.0 by B_SA (Specailly for Nataly & Juliy) *)
procedure TForm5.ShowVariant(S0,S1 : string);
var I :byte;
begin
  if length(S1)=1 then begin Memo1.Lines.Append(S0+S1); Exit end;
  a1 := '';
  a2 :=  copy(S1,I+1,length(S1));
  for i:=1 to length(S1) do ShowVariant(S0+S1[i],copy(S1,1,I-1)+
                             copy(S1,I+1,length(S1)));
end;

procedure TForm5.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Clear;
  ShowVariant('',Edit1.Text)
end;
Вау, спасибо большое
Nockola вне форума Ответить с цитированием
Старый 30.01.2014, 23:05   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

На здоровье.

Если бы Вы догадались воспользоваться поиском по форуму, то легко нашли не только мой пример (я его уже неоднократно на форуме выкладывал), но и другие аналогичные примеры. Есть разные алгоритмы для решения данной задачи...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебор всех вариантов saivs Общие вопросы Delphi 10 16.04.2013 10:06
Генерация всех возможных вариантов NanaTich Помощь студентам 6 23.05.2011 07:00
Перебор всех возможных вариантов phenix Помощь студентам 3 03.12.2010 21:29
Перебор всех возможных вариантов [MI_nor] Общие вопросы C/C++ 9 01.04.2009 21:17