alle Reihenfolgen durchgehen



  • Hallo,

    ich steh vor einem Problem und weiß nicht wie ich es lösen kann.
    Wenn ich zum Beispiel ein x beliebiges Array oder einen String habe, und alle möglichen Reihengolgen durchgehen möchte, wie kann ich das realisiere?

    Beispiel:

    int A [] = {1, 2, 3}
    // Alle mögliche Reihenfolgen
    // 1, 2, 3
    // 1, 3, 2
    // 2, 1, 3
    // 3, 1, 2
    // 2, 3, 1
    // 3, 2, 1
    

    Wie könnte man dies lösen?

    Mfg, MisterVista



  • Probier das mal, hab ich laut Filedatum irgendwann 1996 mal verbrochen:

    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    #include <stdlib.h>
    
    char ein [21];        // Zeiger auf den Eingabestring max. 20 zeichen + \0
    char *aus;            // Zeiger auf den Ausgabestring
    int  leng;            // Anzahl der Zeichen im Eingabestring
    int  anzz = 0;        // Anzahl ausgegebener Zeilen  
    
    void rek (char *x)
    /***********************************************/
    /*  Rekursive Funktion zur Ermittlung s„mtli-  */
    /*  cher Kombinationen der Zeichen im Eingabe- */
    /*  string                                     */
    /*  Eingabe:  Zeiger auf das erste Zeichen im  */
    /*            Eingabestring (global definiert) */
    /*  Ausgabe:  šber den Zeiger <aus> (global)   */
    /*  Vorbereitung:                              */
    /*            Globale Variable (int) leng      */
    /*            enth„lt Anzahl der Zeichen im    */
    /*            Eingabestring                    */
    /***********************************************/
    {
      int i;                           // Laufvariable
    
      if (*x != '\0')
      {
        for (i=0; i < leng; i++)       // Zeichen auf allen Positionen einsetzen
        {
          if (aus[i] == ' ')           // wenn Position unbesetzt,      
          {                            // Zeichen einsetzen und mit n„chstem
            aus [i] = *x   ;           // Zeichen weitermachen
            rek (x+1)     ;
            aus [i] = ' '  ;           // Position wieder l”schen
          }
        }
      }       
      else
      {
        printf ("\n%s", aus) ;
        anzz++               ;
        if (anzz == 24)
        {
          printf ("\n               --- Weiter mit Tastendruck ---") ;
          getch ()     ;
          anzz = 0     ;
        }
      }
    }  
    
    void getein (void)
    /***********************************************/    
    /*  Eingabestring holen und L„nge ermitteln    */
    /***********************************************/
    {
      clrscr ()        ;           // Bildschirm l”schen
    
      printf ("Bitte geben Sie den Eingabestring ein ...\n") ;
    
      scanf ("%20s", ein)  ;       // Eingabe entgegennehmen max. 20 Zeichen
    
      leng = strlen (ein)  ;       // Tats„chliche L„nge ermitteln 
    }     
    
    void getmem (void)
    /***********************************************/
    /*  Speicher fr Ausgabestring reservieren und */
    /*  initialisieren                             */
    /***********************************************/
    {
      aus = malloc (leng + 1) ;    // Speicher (Anzahl Zeichen + \0 reservieren
    
      aus [leng] = '\0'       ;    // Ausgabestring mit Space + \0 
      memset (aus, ' ', leng) ;    // initialisieren
    }
    
    void main (void)
    /***********************************************/
    /*        H A U P T F U N K T I O N            */
    /***********************************************/
    {  
      getein ()           ;       // hol Eingabe
      getmem ()           ;       // Speicher fr den Ausgabestring besorgen
    
      rek (ein)           ;       // Los gehts
    
      free (aus)          ;       // Speicher fr Ausgabestring wieder freigeben
    }
    


  • Na Belly, du trennst deine Semikola aber strikt vom restlichen Code! 😃



  • Hehe, wie gesagt, ist uralt ...
    Ich kann mich noch erinnern, es gab ein Kreuzworträtsel mit 8 Lösungsbuchstaben, die das richtige Lösungswort ergaben - man mußte sie halt in die richtige Reihenfolge bringen.
    Das Programm hat mich nicht wirklich weitergebracht, da es rund 42000 Zeilen ausspuckt.
    Ich habe noch eine Version, die doppelte Lösungen - wenn ein oder mehr Buchstaben mehr als einmal vorkommen - eliminiert, aber das war dann nur noch so eine Spielerei ...



  • Danke, klappt!
    Die abgewandelte Version für merhrfach vorhandene Charaktere würde mich auch interessieren. Könntest du sie reinstellen?



  • A votre service:

    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    #include <stdlib.h>
    
    char ein [21];        // Zeiger auf den Eingabestring max. 20 zeichen + \0
    char *aus;            // Zeiger auf den Ausgabestring
    int  leng;            // Anzahl der Zeichen im Eingabestring
    
    int biswert [21];     // hier wird je Zeichen im Eingabestring festgehalten,
                          // wieweit es im Zielstring nach rechts geschoben
                          // werden soll - abh„ngig von der H„ufigkeit des 
                          // Zeichens
    
    void rek (int pos, int von, int bis)
    /***********************************************/
    /*  Rekursive Funktion zur Ermittlung s„mtli-  */
    /*  cher Kombinationen der Zeichen im Eingabe- */
    /*  string                                     */
    /*  Eingabe:  Zeiger auf das erste Zeichen im  */
    /*            Eingabestring (global definiert) */
    /*  Ausgabe:  šber den Zeiger <aus> (global)   */
    /*  Vorbereitung:                              */
    /*            Globale Variable (int) leng      */
    /*            enth„lt Anzahl der Zeichen im    */
    /*            Eingabestring                    */
    /***********************************************/
    {
      int i ;                           // Laufvariable
    
      if (ein[pos] != '\0')
      {
        for (i=von; i < bis; i++)       // Zeichen auf allen Positionen          
        {                               // von bis einsetzen
          if (aus[i] == ' ')            // wenn Position unbesetzt,      
          {                             // Zeichen einsetzen und mit n„chstem
            aus [i] = ein[pos]   ;      // Zeichen weitermachen
            rek (pos+1, ein[pos] == ein[pos+1] ? i+1 : 0, biswert[pos+1])  ;
            aus [i] = ' '  ;           // Position wieder l”schen
          }
        }
      }       
      else
      {
        printf ("\n%s", aus) ;
      }
    }  
    
    void getein (void)
    /***********************************************/    
    /*  Eingabestring holen und L„nge ermitteln    */
    /***********************************************/
    {
      clrscr ()        ;           // Bildschirm l”schen
    
      printf ("Bitte geben Sie den Eingabestring ein ...\n") ;
    
      scanf ("%20s", ein)  ;       // Eingabe entgegennehmen max. 20 Zeichen
    
      leng = strlen (ein)  ;       // Tats„chliche L„nge ermitteln 
    }     
    
    void getmem (void)
    /***********************************************/
    /*  Speicher fr Ausgabestring reservieren und */
    /*  initialisieren                             */
    /***********************************************/
    {
      aus = malloc (leng + 1) ;    // Speicher (Anzahl Zeichen + \0 reservieren
    
      aus [leng] = '\0'       ;    // Ausgabestring mit Space + \0 
      memset (aus, ' ', leng) ;    // initialisieren
    }
    
    int sort (char *a, char *b)
    /***********************************************/
    /*  Vergleichsfunktion fr die Sortierung      */
    /***********************************************/
    {                                        
      return (*a - *b) ;
    }
    
    void fillbis (void)
    /***********************************************/
    /*  Fr mehrfach vorkommende Zeichen wird ab-  */
    /*  h„ngig von ihrer Position bestimmt, wie    */
    /*  weit sie nach rechts geschoben werden      */
    /***********************************************/
    {
      int i ;
    
      biswert [leng] = leng  ;
    
      for (i = leng - 1; i >= 0; i--)
      {
        if (ein [i] == ein [i+1])
           biswert [i] = biswert [i+1] - 1  ;
        else
           biswert [i] = leng           ;
      }
    }
    
    void main (void)
    /***********************************************/
    /*        H A U P T F U N K T I O N            */
    /***********************************************/
    {  
      getein ()           ;       // hol Eingabe
      getmem ()           ;       // Speicher fr den Ausgabestring besorgen
      qsort (ein, leng, 1, (int (*) ()) sort); // sortieren des Eingabestrings
    
      fillbis ()          ;       // Endposition je Zeichen festlegen
    
      rek (0,0,biswert[0])           ;       // Los gehts
    
      free (aus)          ;       // Speicher fr Ausgabestring wieder freigeben
    }
    

Anmelden zum Antworten