Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Array "sortier" Problem


Kalle557 - Di 02.08.11 18:29
Titel: Array "sortier" Problem
Hallo zusammen,

ich habe seit langer Zeit wieder mit Delphi angefangen und stehe vor einem "Array sortier-Problem". Angenommen es ist ein Array mit 6 Elementen A B C D E F

ich suche mir das 2. Element raus (B) und will alle Möglichkeiten addieren, die VOR B austauschbar wären. Also

AB + CB + DB + EB + FB

danach soll das ausgewählte Element (B) einen Schritt nach hinten gehen A C B D E F

...und dann wieder, alle Möglichkeiten VOR B addieren.

ACB + CAB + CDB + DCB usw.

Das Spiel soll so weiter gehen bis B am Ende des Arrays ist.

Ich programmiere nur zum Spaß und verzweifel fast an diesem Vorgang :( Wäre echt super wenn mir jemand helfen könnte.

Gruß,
Kalle


jaenicke - Di 02.08.11 18:41

Das nennt sich Permutation, ich denke mit dem Stichwort findest du schon einiges. ;-)


Kalle557 - Di 02.08.11 18:47

wow danke für die schnelle antwort. werde gleich mal danach suchen...

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

ich habe ein code-beispiel gefunden und auch getestet. aber ich glaube mein problem ist etwas komplexer, weil ich den array quasi durch mein "hauptelemt" in zwei teile. der linke teil vom array wird komplett durchgeschmischt mit den elementen aus dem rechten teil des arrays...bis alle möglichkeiten ausgeschöpft sind. danach geht mein hauptelemt ein schritt nach "hinten" im array. bei dem gefundenen code-beispiel wurden einfach alle möglichkeiten von allen elementen im array getestet.

hm ich werde nochmal bisschen rum probieren aber die richtige erleuchtung habe ich noch nicht ;)


jaenicke - Di 02.08.11 23:19

Das meinte ich auch eher als Anregung wie man sowas grundsätzlich angeht. Denn eine vollständige Permutation ist das ja nicht. Mal so runtergeschrieben, ungetestet:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure PermutePartial(ADest: TStrings; const AChars: stringconst AFixedChar, ALength: Integer);

  procedure DoPermutePartial(ADest: TStrings; const AChars, AValue: stringconst ALength: Integer;
    ALastChar: Char);
  var
    i: Integer;
  begin
    if Length(AValue) = ALength then
      ADest.Add(AValue + ALastChar)
    else
      for i := 1 to Length(AChars) do
        DoPermutePartial(ADest, Copy(AChars, 1, i - 1) + Copy(AChars, i + 1, MaxInt), AValue + AChars[i],
          ALength, ALastChar);
  end;

begin
  if (AFixedChar < Length(AChars)) and (Length(AChars) > 0then
    DoPermutePartial(ADest, Copy(AChars, 1, AFixedChar - 1) + Copy(AChars, AFixedChar + 1, MaxInt),
      '', ALength - 1, AChars[AFixedChar]);
end;


// Beispielaufrufe:
PermutePartial(MyListBox.Items, 'ABCDEF'22);
PermutePartial(MyListBox.Items, 'ABCDEF'23);


Kalle557 - Mi 03.08.11 10:31

Danke für die Mühe, ich habe es hinbekommen :)!