000
13.10.2005, 22:13 Uhr
Jens
|
Hallo,
ich habe mir mal überlegt einen Algorithmus zu schreiben, der von einem Wort und dessen Buchstaben alle möglichen Zusammensetzungen ausgibt, also wenn man folgendes eingibt: abc
Soll rauskommen: abc acb bac bca cab cba
Bei entsprechend längeren Wörtern wird es entsprechend mehr. Ich habe zwar schon einen Algorithmus, der gibt jedoch nicht alle Möglichkeiten aus (Kombiniere):
C++: |
void Kombiniere(AnsiString, AnsiString); void Kombiniere3(AnsiString, AnsiString);
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString AS; Memo1->Lines->Clear(); AS=Edit1->Text; AS=AS.LowerCase(); Kombiniere3(AS, ""); } //---------------------------------------------------------------------------
void Kombiniere(AnsiString Wort,AnsiString Loesung) { if (Wort.Length()==0) { Form1->Memo1->Lines->Add(Loesung); return; } int i,max; i = 1; max = Wort.Length(); do { Loesung.Insert(Wort.SubString(1,1), i); Wort.Delete(1,1); Kombiniere(Wort, Loesung); i++; } while (i<=max); }
|
Daraufhin habe ich das Ganze mal nur für 3 Buchstaben probiert, aber irgendwo mache ich nen Denkfehler:
C++: |
void Tausche(AnsiString &Text,int a, int b) { AnsiString Help="", Help2=""; Help.Insert(Text.SubString(a,1),1); Help2.Insert(Text.SubString(b,1),1); Text.Delete(a,1); Text.Insert(Help2,a); Text.Delete(b,1); Text.Insert(Help,b); }
void Kombiniere3(AnsiString Wort, AnsiString Loesung) { for(int b=1; b<=3; b++) { for(int a=1; a<=3; a++) { if (a!=b) { Tausche(Wort,b,a); Form1->Memo1->Lines->Add(Wort); Tausche(Wort,b,a); } } } }
|
Also es soll ein Algorithmus rauskommen, der alle Kombinationsmöglichkeiten der Buchstaben rausgibt und dabei nichts doppelt ausgibt, ausgenommen, wenn ein Wort einen Buchstaben doppelt hat.
Danke. |