Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Kombinationsalgorithmus

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.10.2005, 22:44 Uhr
Spacelord
Hoffnungsloser Fall


Hallo,
sowas gibt es alles schon.
next_permutation und prev_permutation sind die Kandidaten der Wahl.

C++:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    vector<string> v;
    string s;
    s="abc";
    v.push_back(s);
    while(next_permutation(s.begin(),s.end()))
        v.push_back(s);
    vector<string>::const_iterator it=v.begin();
    while(it!=v.end())
    {
        cout<<*it<<endl;
        it++;
    }
    cout<<v.size()<<" Permutationen gefunden"<<endl;
    
    return 0;
}


That´s it.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 13.10.2005 um 22:51 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.10.2005, 18:53 Uhr
Jens



Danke für die Antwort.
habe es schon ausprobiert und funktioniert ohne Probleme.
Jetzt hat sich auch das anschließende Sortieren erledigt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: