02.03.2008, 16:17
|
Активный
|
|
Регистрация: 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.
|