Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.05.2008, 21:18
Brute Force Brute Force вне форума
Прохожий
 
Регистрация: 21.03.2008
Сообщения: 15
Репутация: 10
По умолчанию Комбинаторика

Здравствуйте!
Не получается у меня следующая задача: есть строка на N символов, набор допустимых символов состоит из M букв (например, 'a, b, c, ...,m').
Как мне в компоненте Memo отобразить все возможные сочетания этих символов в строке без повторов. То есть, примерно так:
a...aaa (N штук)
a...aab
a...aac
.........
m...mmm

Спасибо.
Ответить с цитированием
  #2  
Старый 06.05.2008, 21:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Лень писать код, но примерно алгоритм выглядит так:

1. Забиваем буферную строку 1 первым символом (N штук). вот тебе уже первый элемент. Выводим в Мемо.
2. Забиваем Забиваем буферную строку 2 последним символом (опять N штук). Это конечный элемент.
3. В цикле пока строка 1 не равна строке 2 меняем крайний символ на следующий, с контролем и переносом (т.е. если там уже последний символ, то меняем следующий, а этот сбрасываем в первый).
4. Выводим в Мемо строку 2.

Примерно так.
При этом смену символа лучше всего сделать отдельной процкой с рекурсией для упрощения кода.
Ответить с цитированием
  #3  
Старый 06.05.2008, 22:13
Brute Force Brute Force вне форума
Прохожий
 
Регистрация: 21.03.2008
Сообщения: 15
Репутация: 10
По умолчанию

Вот с рекурсией у меня и проблема.
Понятно, что менять символ в строке можно с помощью цикла:
Код:
For i:=1 to M do
begin
  Stroka[k]:=NaborSimvolov[i];
  Memo.Lines.Add(Stroka);
end;
где NaborSimvolov='abcd...m' - строка из всех допустимых символов.

А вот как осуществлять рекурсию и задавать переменную k, чтобы повторов не было и все сочетания вывелись?

Последний раз редактировалось Brute Force, 06.05.2008 в 22:17.
Ответить с цитированием
  #4  
Старый 06.05.2008, 23:45
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, на самом деле это выглядеть должно где-то так (пишу прямо тут, так что за компиляемость не ручаюсь, главное смысл):

Код:
// Где-то описана строка со всеми доступными символами, например, для 3 она будет содержать 'abc'
var
  AllSymbols : String;

// процка, делающая замену
procedure ChangeSymbol(Idx : Integer; var S : String);
var
  Ch : Char;
  NextCh : Char;
begin
  // текущий символ в позиции Idx
  Ch := S[Idx];

  // находим следующий символ
  For I := 1 To Length(AllSymbols) Do
    If AllSymbols = Ch Then
      Begin
        // если он последний, то следующий будет первый, иначе - следующий
        If I = Length(Allsymbols) Then NextCh := AllSymbols[1] Else NextCh := Allsymbols[I+1];
        Break;
      End;

  // если символ первый среди возможных, то надо поменять предшествующий - переход позиции
  If NextCh := AllSymbols[1] Then  ChangeSymbol(Idx-1,S);

  // меняем символ
  S[Idx] := NextCh;
end;

ну фактически тебе осталось написать инициализацию всех переменных и выталкивание этого добра в Мемо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:41.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025