Показать сообщение отдельно
  #2  
Старый 02.03.2008, 16:17
Rosenkrantz Rosenkrantz вне форума
Активный
 
Регистрация: 04.12.2007
Адрес: Москва
Сообщения: 234
Версия Delphi: Delphi 7
Репутация: 40
По умолчанию

Возможно, поможет вот это - программа, которая перебирает все комбинации букв/цифр в строке.
Т.е. если строка 123, то результат будет:
123
132
213
231
312
321

Код:
program Reshuffle;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  StrLen  : Integer;

//------------------------------------------------------------------------------
// Обменять местами символы в строке
//------------------------------------------------------------------------------
procedure Swap(var S: String; l, k: Integer);
var
  C: Char;
begin
  C    := S[l];
  S[l] := S[k];
  S[k] := C;
end;

//------------------------------------------------------------------------------
// Сортировка строки
//------------------------------------------------------------------------------
function  SortString(const S: String): String;
var
  i, j   : Integer;
  NoSwap : Boolean;
begin
  Result := S;
  for i := 1 to StrLen - 1 do begin
    NoSwap := True;
    for j := StrLen downto i do
      if Result[j] <=Result[i] then begin
        Swap(Result, i, j);
        NoSwap := False;
      end;
    if NoSwap then Exit;
  end;
end;

//------------------------------------------------------------------------------
// Получить следующую комбинацию символов
//------------------------------------------------------------------------------
function GetNext(var S: String): Boolean;
var
  i, j: Integer;
begin
  i := pred(StrLen);

  while (i > 0) and (S[i] > S[i + 1]) do
    dec(i);

  if i > 0 then begin
    j := i + 1;
     {поиск j}
    while (j < StrLen) and (S[j + 1] > S[i]) do
      inc(j);

    Swap(S, i, j);

    for j := i + 1 to (StrLen + i) div 2 do
      Swap(S, j, StrLen - j + i + 1);

    Result := True
  end else
    Result := False;
end;

var
  Str     : String;
  Stop    : Boolean;
  iCount  : Integer;
  F       : Text;
begin
  Write('String: ');
  Readln(Str);

  StrLen := Length(Str);
  Str    := SortString(Str);

  iCount := 0;  // Это просто счетчик комбинаций для красоты

  // Имя файла для вывода результатов будет таким же,
  // как у исполняемого, расширение '.txt'
  AssignFile(F, ChangeFileExt(ParamStr(0), '.txt'));
  Rewrite(F);
  repeat
    iCount := iCount + 1;
    Writeln(iCount:10, '. ', Str);
    Writeln(F, iCount:10, '. ', Str);

  	Stop := GetNext(Str);
  until not Stop;
  CloseFile(F);

  Writeln;
  Writeln('Press Enter...');
  Readln;
end.
Ответить с цитированием