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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.08.2008, 05:18
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию Перебор букв в слове

Помогите пожалуйста..

Есть слово например это переменная S. Нужно чтобы в Memo добавлялся возможный вариант.

Например: слово ABC

В Memo:

ACB
BAC
BCA
CAB
CBA
Ответить с цитированием
  #2  
Старый 11.08.2008, 00:27
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

Никто не знает?..
Ответить с цитированием
  #3  
Старый 11.08.2008, 01:48
shaman shaman вне форума
Новичок
 
Регистрация: 19.07.2007
Сообщения: 65
Репутация: 5
По умолчанию посмотри, может поможет

посмотри, может поможет

http://www.delphisources.ru/forum/showthread.php?t=2927
Ответить с цитированием
  #4  
Старый 11.08.2008, 02:01
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

Чтото не катит, я не то имел ввиду.. в примере БД создается со словарём а мне просто нужно найти все варинты при переб оре
Ответить с цитированием
  #5  
Старый 11.08.2008, 02:49
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию ???

А чесло букв определено или слова разной длины?
Ответить с цитированием
  #6  
Старый 11.08.2008, 04:43
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

Пользователь должен ввести слово в TEdit например. Но колличество букв не проблема

Код:
Length(Edit1.Text);
Ответить с цитированием
  #7  
Старый 11.08.2008, 06:57
Аватар для Zander_driver
Zander_driver Zander_driver вне форума
Прохожий
 
Регистрация: 07.03.2008
Сообщения: 29
Репутация: 10
По умолчанию

Вобще-то проблема...
Поидее алгоритм такой - сначала перебираем все возможные варианты как подставить первую букву комбинации. Потом меняем следующую букву и опять перебираем первую. Потом опять и т.д. пока не переберем все буквы столько раз сколько возможно вариантов подстановки каждой буквы.
Т.е. циклов будет столько сколько букв. Я попробовал такой код написать - что то у меня неполучилось. не из-за вложенных циклов, просто не получается алгоритм организовать.
Ответить с цитированием
  #8  
Старый 11.08.2008, 11:48
shaman shaman вне форума
Новичок
 
Регистрация: 19.07.2007
Сообщения: 65
Репутация: 5
Радость Вот код:)

Всё таки у меня получилось решить твою задачу. Вот код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  SBase, SDict: string; 

  procedure BruteForce(S: string; n: integer); 
  var
   i: integer;
  begin
   for i := 1 to Length(SDict) do
   begin
     s[n] := SDict[i];
     if n = 1 then
       Memo1.Lines.Add(s)
     else
       BruteForce(s, n - 1);
   end;
  end;

begin
  SBase := edit1.Text;    // длина генерируемых слов
  SDict := edit1.Text;  // символы из которых будем генерировать
  BruteForce(SBase, Length(SBase));
end;

end.
Admin: Информация по тегам тут. Настоятельно советую изучить, дабы не нарушать правила форума, которых следует придерживаться всем и каждому.

P.S. Админ, извини, у меня теги не получается вставить
Вложения
Тип файла: rar Генератор паролей.rar (5.6 Кбайт, 41 просмотров)

Последний раз редактировалось Admin, 11.08.2008 в 12:18.
Ответить с цитированием
  #9  
Старый 11.08.2008, 14:27
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию )))

Вот вроде рабочий вариант, только не забудь что число перестановок растет со скорость факторриала!!!

Код:
type
 TIntVec = array of Integer;

procedure AllPermutations(n: Integer; var a: TIntVec; S: String);
var
 i: Integer;
 Nums: TIntVec;
//------------------------------------
  function ExistsInNums(Num: Integer): boolean;
  var
   j: Integer;
  begin
   Result := false;
    for j := 1 to n do
     if Nums[j] = Num then
     begin
      Result:= true;
      exit;
     end;
  end;

  procedure WorkWithPerm;
  var
   i: Integer;
   Res: String;
  begin
   SetLength(Res, Length(S));

    for i := 1 to n do
      Res[i] := S[a[Nums[i]]];
   Form1.Memo1.Lines.Add(Res);
  end;

  procedure ResurseForPerm(j, i: Integer);
  var
   k: Integer;
  begin
   Nums[j] := i;
    if j = n then
     WorkWithPerm
    else
     for k := 1 to n do
      if not ExistsInNums(k) then
       ResurseForPerm(j+1, k);
   Nums[j] := 0;
  end;
// ---------------------------------------
begin
 SetLength(Nums, n+1);
  for i := 1 to n do
   ResurseForPerm(1, i);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 n, i: Integer;
 a: TIntVec;
 S: String;
begin
 Memo1.Clear;

 S := Edit1.Text;
 n := Length(S);
 SetLength(a, n+1);
  for i := 1 to N do
   a[i]:= i;

 AllPermutations(n, a, S);

 label1.Caption := IntToStr(Memo1.Lines.Count);
end;

Еще, для трех символов можно использовать:
Код:
var
C1, C2: Char;
i, j: Integer;
Source: String;
begin

Source := Edit1.Text;

 for i := 1 to Len do
 begin
  for j := 1 to Length(Source) do
  begin
   C1 := Source[j];
   C2 := Source[j +1];
 
   Source[j] := C2;
   Source[j + 1] := C1;

   Memo1.Lines.Add(Source);
  end;
 end;
end;

а для четырехсимвольного:
Код:
var
C1, C2: Char;
i, j: Integer;
Source: String;
begin

Source := Edit1.Text;

 for i := 1 to Length(Source) do
 begin
  for j := 1 to Length(Source)-1 do
  begin
   C1 := Source[j];
   C2 := Source[j +1];
 
   Source[j] := C2;
   Source[j + 1] := C1;

   Memo1.Lines.Add(Source);
  end;
 end;

  for i := 1 to Length(Source) do
  begin
   for j := Length(Source) downto 2 do
   begin
    C1 := Source[j];
    C2 := Source[j - 1];

    Source[j] := C2;
    Source[j - 1] := C1;

    Memo1.Lines.Add(Source);
   end;
  end;
end;
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter