Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#18

Re: 1,2,3,4,5,6 - Reihenfolgen

  Alt 22. Jul 2003, 21:10
Hi

Hier mal meine Lösung

Delphi-Quellcode:
procedure Combi(const Value: String; List: TStrings);

  procedure DoCombi(Pattern,Pos,Stop: PChar);
  // Erzeuge alle Kombinationen ohne Duplikate (Permutationen) aus Pattern von der
  // Zeichenposition Pos angefangen bis zur Zeichenposition Stop.
  // Pattern muß alpha. sortiert sein.
  // 'AABCDEEXYZ' ist korrekt, aber 'KABA..' ist falsch.
  // Pattern enthält nach Rückkehr von DoCombi() wieder die ursprüngliche
  // Sortierung, wird aber während der Rekursion modifiziert.
  // Die Kombinationen werden alpha. aufsteigend enumeriert.
  var
    Cur: PChar;
    Tmp,Last: Char;
  begin
    if Pos >= Stop then
    begin
      List.Add(Pattern);
      Exit;
    end;
    Last := #0;
    Cur := Pos;
    while Cur <= Stop do
    begin
      Tmp := Cur^; Cur^ := Pos^; Pos^ := Tmp;
      if Tmp > Last then
      // verhindere Duplikate !
      // Falls alle Kombinationen, inklusive Duplikate enumeriert werden sollen
      // muß diese Abfrage entfernt werden. Die Restriktion der alpha. Sortierung
      // ist dann auch nicht mehr erforderlich.
      begin
        DoCombi(Pattern, Pos +1, Stop);
        Last := Tmp;
      end;
      Inc(Cur);
    end;
    Tmp := Pos^;
    while Pos < Stop do
    begin
      Pos^ := Pos[1];
      Inc(Pos);
    end;
    Pos^ := Tmp;
  end;

var
  Temp: String;
begin
  Temp := Value;
  UniqueString(Temp);
  DoCombi(@Temp[1], @Temp[1], @Temp[Length(Temp)]);
end;

procedure Test;
var
  List: TStringList;
begin
  List := TStringList.Create;
  try
    Combi('123456', List);
    WriteLn(List.Text);
  finally
    List.Free;
  end;
end;
Sie ist ein bischen weniger aufwendig und arbeitet inplaced.

Oder hier Kombination und Permutation von Strings/Integern

Gruß Hagen
  Mit Zitat antworten Zitat