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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.08.2010, 14:17
Respawn Respawn вне форума
Прохожий
 
Регистрация: 24.08.2010
Сообщения: 5
Репутация: 10
По умолчанию Перебор

Люди добрые помогите!
Есть набор слов A,B,C,D,E надо перебрать все возможные комбинации, но не меняя местами, т.е. в начале будет A ... B ... C ... D ... E ... AB ... AC ... AD ...AE ... ABC и так до ABCDE, подскажите как организовать вложенные циклы.
Ответить с цитированием
  #2  
Старый 24.08.2010, 14:41
Аватар для march
march march вне форума
Начинающий
 
Регистрация: 04.05.2009
Сообщения: 110
Репутация: 18
По умолчанию

Код:
var
  F : TextFile;
  A, B, C, D, E : Integer;
begin
  AssignFile(F, 'dict.txt');
  Rewrite(F);
  for E := Ord('a') to Ord('z') do
    for D := Ord('a') to Ord('z') do
      for C := Ord('a') to Ord('z') do
        for B := Ord('a') to Ord('z') do
          for A := Ord('a') to Ord('z') do
            WriteLn(F, Char(E)+Char(D)+Char(C)+Char(B)+Char(A));

  CloseFile(F);
end;
Давно, давно где-то это использовать собирался, да руки не дошли. Должно работать.
__________________
От корректности формулировки поставленной задачи зависят:
качество, скорость и желание её реализации!
Ответить с цитированием
  #3  
Старый 24.08.2010, 15:30
Respawn Respawn вне форума
Прохожий
 
Регистрация: 24.08.2010
Сообщения: 5
Репутация: 10
По умолчанию

march, не совсем так .... A,B,C,D,E - это слова - пусть будут - Юля, Таня, Табуретка, Космос, Труд ... надо перечислить все комбинации, но не переставляя местами, т.е. комбинации Таня, Юля - не может быть ..... первая комбинация - это Юля, потом Таня и т.д. пока не дойдем до полного набора A,B,C,D,E ...
Ответить с цитированием
  #4  
Старый 24.08.2010, 15:51
Программер_Х
 
Сообщения: n/a
По умолчанию

брутфорсер =)
Ответить с цитированием
  #5  
Старый 24.08.2010, 22:26
Respawn Respawn вне форума
Прохожий
 
Регистрация: 24.08.2010
Сообщения: 5
Репутация: 10
По умолчанию

Программер_ХХХороший
Практически да, но очень специфический - так как слова не меняют своих позиций, они либо могут участвовать в общей комбинации, либо отсутствовать и их именно 5 (входных), хотя если есть реализации с 3-4- ... -6 и т.д. не беда, переделаю )
Ответить с цитированием
  #6  
Старый 24.08.2010, 22:42
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Понравилась мне эта задачка, решил ее, но давольно таки нестандартным решением, так как стандартное решение показалось очень скучным)

Последний раз редактировалось Asinkrit, 02.04.2011 в 20:20.
Ответить с цитированием
  #7  
Старый 25.08.2010, 07:27
Respawn Respawn вне форума
Прохожий
 
Регистрация: 24.08.2010
Сообщения: 5
Репутация: 10
По умолчанию

Asinkrit,
Отлично, то что надо, но при переборе не задействованы все варинты, а именно нету вариантов BC, BD, BCDE ... CD, CDE .... DE, ведь элемент А - тоже может не учавствовать в исходной комбинации на ровне с другими.
Ответить с цитированием
  #8  
Старый 25.08.2010, 09:47
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

Код:
const
  bk = 'ABCDE';
var
  I1, I2: Integer;
begin
  Memo1.Text:= bk;
  for I1:=1 to 5 do
    Memo1.Lines.Add(bk[I1]);
  for I1:= 1 to 5 do
  for I2:= 2 to 5 do
    if (I1<>I2) and (I1<I2) then
      Memo1.Lines.Add(bk[I1]+bk[I2]);
end;
Ответить с цитированием
  #9  
Старый 25.08.2010, 10:27
Respawn Respawn вне форума
Прохожий
 
Регистрация: 24.08.2010
Сообщения: 5
Репутация: 10
По умолчанию

pesi. после обработки "напильником", получилось:

Код:
const
  bk = 'ABCDE';
var
  I1, I2, I3, I4: Integer;
begin
  Memo1.Text:= bk;
  for I1:=1 to 5 do
    Memo1.Lines.Add(bk[I1]);
  for I1:= 1 to 5 do
  for I2:= 2 to 5 do
    begin
      if (I1<>I2) and (I1<I2) then
        Memo1.Lines.Add(bk[I1]+bk[I2]);
        for I3:= 3 to 5 do
          begin
          if (I1<>I2) and (I2<>I3) and (I1<I2) and (I2<I3) then
          Memo1.Lines.Add(bk[I1]+bk[I2]+bk[I3]);
            for I4 := 4 to 5 do
              if (I1<>I2) and (I2<>I3) and (I3<>I4) and (I1<I2) and (I2<I3) and (I3<I4) then
              Memo1.Lines.Add(bk[I1]+bk[I2]+bk[I3]+bk[I4])
          end;
    end;
end;

Код:
ABCDE
A
B
C
D
E
AB
ABC
ABCD
ABCE
ABD
ABDE
ABE
AC
ACD
ACDE
ACE
AD
ADE
AE
BC
BCD
BCDE
BCE
BD
BDE
BE
CD
CDE
CE
DE

Вроде все правильно, БОЛЬШОЕ Вам СПСИБО!!!!!!!!!!
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter