![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Человеки, плиз подскажите пример как из данных букв перебрать все значения?
Например дано: QWA(количество букв не известно) Значения: QWA WQA AQW QAW WAQ и т.д ОЧень нужно, чесно. Ответ нужен как можно скорее. Заранее пасибо ! |
|
#2
|
|||
|
|||
|
Код:
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;
begin
Write('String: ');
Readln(Str);
StrLen := Length(Str);
Str := SortString(Str);
iCount := 0; // Это просто счетчик комбинаций для красоты
repeat
iCount := iCount + 1;
Writeln(iCount:10, '. ', Str);
Stop := GetNext(Str);
until not Stop;
Writeln;
Writeln('Press Enter...');
Readln;
end.Алгоритм перестановок взял отсюда и переделал для строки. Работает только на упорядоченных последовательностях, поэтому строка предварительно сортируется. Сортировка пузырьковая, самая простая. UPD: Если в строке будут повторяющиеся символы, то его клинит. Но по условию задачи их быть не должно. Последний раз редактировалось Rosenkrantz, 02.01.2008 в 14:51. |