Problem an einer Logik-Aufgabe (zeichenverdrehung)



  • Hi!

    Gegeben ist eine beliebig-lange Zeichenfolge. Beispiel 345RTE5A

    Man kann in dieser Zeichenfolge beliebig viele Zeichen untereinander vertauschen...

    Und ich möchte eine Möglichkeit haben alle diese Möglichkeiten auszugeben..

    So dass aus ABC z.B. folgendes wird:
    ABC
    ACB
    BAC
    BCA
    CAB
    CBA

    wie kann man dies anstellen? Nehme auch gerne C++ Codes an 😉

    MfG
    Benjamin



  • Einmal jedes Element mit jedem, müsste in 2 Schleifen gehen, eine die das
    aktuell zu vertauschende Element angibt (von links nach rechts) und eine innere
    Schleife welche es mit allen anderen vertauscht.

    char zeichen[] = "ABC";
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; i++) {
            if (zeichen[j] != zeichen[i]) {
                int temp = zeichen[i];
                zeichen[i] = zeichen[j];
                zeichen[j] = temp;
                printf ("%s\n",zeichen);
            }
        }
    }
    

    Alles was du noch machen musst ist eben ne Kopie für das vertauschen zu verwenden
    oder nur in der Ausgabe durch richtiges angeben vertauschen.
    So würde es nicht funktionieren weil die Zeichenkette ja verändert wird,
    aber so ungefähr müsste das aussehen.



  • Dazu würde ich next_permutation benutzen...



  • Ganz so meinte ich das nicht ^^"
    Hab mich nicht ganz gut ausgedrückt.

    Dein Code macht jetzt immer nur EINEN Austausch und gibt das Ergebnis an.

    Das Problem ist dass man im Endeffekt X mal austauschen kann bevor es ausgegeben wird.

    so dass aus ABCD auch BADC werden könnte..



  • _ProfEich schrieb:

    Dein Code macht jetzt immer nur EINEN Austausch und gibt das Ergebnis an.

    Hmm, wen meinst du jetzt 😕
    Ich meinte das ungefähr so:
    Zu einer n-elementigen Menge gibt es n! verschiedene Möglichkeiten, diese zu kombinieren => n! berechnen, Schleife von 0 bis n!-1 durchlaufen und fertig...



  • Warum n! berechnen? next_permutation gibt doch zurück, ob es noch mehr gibt:

    char v[] = "345RTE5A";
    cout << v << ' ';
    while(next_permutation(v,v+8))
       cout << v << ' ';
    


  • danke nomma hat geklappt mit dem next_permutation.

    das vorherige war auf SirLant bezogen.


Anmelden zum Antworten