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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2019, 19:31   #1
Raizel
 
Регистрация: 21.01.2015
Сообщений: 7
Восклицание Поиск всех возможных комбинаций слов

Всем доброго времени суток!
Подскажите, есть задача, найти все возможные комбинации слов из списка.
Например, из списка: арбуз, банан, слива, вишня нужно получить примерно следующее:
  1. арбуз
  2. арбуз - банан
  3. арбуз - банан - слива
  4. арбуз - банан - слива - вишня
  5. банан
  6. банан - арбуз
  7. банан - арбуз - слива
  8. банан - арбуз - слива -вишня
  9. ...
понимаю что количество комбинации будет расти в геометрической прогрессии с добавлением каждого нового элемента в список. Но нужны не все комбинации, они будут отфильтровываться. Главное условие, каждый элемент должен повторятся только один раз. И комбинации банан - арбуз и арбуз - банан, это разные комбинации. На одном форуме, мне подсказали код, который решаем мою задачу, если представить элементы строкой:
Код:
procedure Generate(s, comb: string; idx: Integer);
var
  i, k: Integer;
  temp: string;
begin
  if idx > Length(s) then begin
    if Length(comb) > 0 then
      Writeln(comb);
    Exit;
  end;

  for k := 1 to Length(comb) + 1 do begin
    temp := comb;
    Insert(s[idx], temp, k);
    Generate(s, temp, idx + 1);
  end;
  Generate(s, comb, idx + 1);
end;

begin
  Generate('abc', '', 1);
  Readln;
end
Но при попытке переделать процедуру под список, столкнулся с ошибками. Вот пример моего кода:

Код:
procedure Generate(list, comb: TStringList; idx: integer);
var
  temp :  TStringList;
  i, k : integer;
begin
  temp                  := TStringList.Create;
  temp.Duplicates   := dupIgnore;
  temp.Sorted        := false;


  if idx >  list.Count-1 then
    begin
      if  comb.Count-1 > 0 then
        begin
          Form1.Memo1.Lines.Add(comb.Text);
        end;
    Exit;
  end;


  for k := 0 to comb.Count-1 do begin
    temp.Assign(comb);
    temp.Insert(k, list[idx]);
    Generate(list, temp, idx + 1);
  end;
  Generate(list, comb, idx + 1);

comb.Free;
end;
Ошибка "Invalid pointer operation".

Подскажите, где ошибся? Или, если есть, другой вариант решения задачи. Большое спасибо!
Raizel вне форума Ответить с цитированием
Старый 08.05.2019, 21:04   #2
Raizel
 
Регистрация: 21.01.2015
Сообщений: 7
Хорошо

Тот же хороший человек, помог решить эту проблему! ) Тему можно закрывать, решение найдено. Код оставлю на случай, если вдруг кому то пригодится))


Код:
procedure GenerateList(list, comb: TStringList; idx: integer);
var
  k : integer;
begin
  if idx > list.Count-1 then begin
    if comb.Count > 0 then
      Writeln(comb.CommaText);
    Exit;
  end;

  for k := 0 to comb.Count do begin
    comb.Insert(k, list[idx]);
    GenerateList(list, comb, idx + 1);
    comb.Delete(k);
  end;
  GenerateList(list, comb, idx + 1);

end;
Raizel вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск возможных комбинаций из заданного диапазона jedi1320 Софт 7 16.02.2016 08:36
Комбинаторика - нахождение всех возможных комбинаций chandrasecar Общие вопросы Delphi 20 15.03.2014 11:57
Количество возможных комбинаций саша40 Общие вопросы Delphi 2 27.07.2013 14:54
Перебор возможных комбинаций в матрице N*N Руслан_911 Помощь студентам 3 25.11.2010 20:35
Перебор возможных комбинаций символов Toxask8 Общие вопросы C/C++ 1 12.12.2009 21:33