Algo: créer toutes les combinaisons possibles

Résolu/Fermé
Kobaya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   -  
 librequetucrois -
Bonjour à tous,

Je me creuse la tête depuis un bon moment déjà pour résoudre ceci :
J'ai 3 éléments A, B et C. Comment faire pour construire toutes les combinaisons possibles (ABC, ACB, BAC, BCA, CAB, CBA), sachant que le nombre d'éléments peut aller jusqu'à 4 ou 5. Le nombre de combinaisons est n!, mais part ça...
J'ai essayé en vain plusieurs combinaisons de boucles FOR/NEXT, DO/LOOP...

A défaut de me donner l'algorythme, voire le prog en VB, si quelqu'un a une piste, une idée de départ, c'est pas de refus!

A+,
Kobaya.
Configuration: Windows XP PRO
Pentium 4

11 réponses

  1. p.legal Messages postés 89 Statut Membre 24
     
    La modif est simple, j'ai ajouté la "sub" nomée doublon.

        text$="ABCDEA"
        debut$=""
        global result$, debut$, glon, nb, blok
        debut$=text$
        glon=len(text$)
        call doublon text$
        if blok=1 then end
        r$=combine$(text$)
        print "il y a ";nb;" réponses."
        input r$
        end
    
    function combine$(text$)
        lon=len(text$)
        for i=1 to lon
            trace 2
            text2$=mid$(text$,i+1)+left$(text$,i-1)
            ch$=mid$(text$,i,1)
            result$=result$+ch$
            if text2$<>"" then
                r$=combine$(text2$)
            else
                rlon=len(result$)
                dlon=glon-rlon
                result$=left$(debut$,dlon)+result$
                debut$=result$
                print result$
                result$=""
                nb=nb+1
            end if
        next i
        combine$=""
        end function
    
    sub doublon txt$
        lon=len(txt$)
        for i=1 to lon
            ch$=mid$(txt$, i, 1)
            for j=1 to lon
                if j=i then exit for
                if ch$=mid$(txt$, j, 1) then blok=1: exit for
            next j
            if blok=1 then exit for
        next i
        if blok=1 then
            notice "Doublon detecté !"+chr$(13)+"Le caractère '"+ch$+"' à été detecté en double."
        end if
        end sub


    et maintenant, cela te convient t'il ?

    voici le resultat pour la chaine "ABCD":
    ABCD
    ABDC
    ACDB
    ACBD
    ADBC
    ADCB
    BCDA
    BCAD
    BDAC
    BDCA
    BACD
    BADC
    CDAB
    CDBA
    CABD
    CADB
    CBDA
    CBAD
    DABC
    DACB
    DBCA
    DBAC
    DCAB
    DCBA
    il y a 24 réponses.
    ?
    
    38
    1. Kobaya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   214
       
      Ca y est ! Ca marche !!!

      En fait, je n'ai pas utilisé la procédure doublon(), et ça semble fonctionner (j'ai testé jusqu'à 7 éléments).

      Donc, un grand merci à toi p.legal :-)

      0
    2. scorpions59
       
      desoler il te manque AACD et AADC
      -1
      1. p.legal Messages postés 89 Statut Membre 24 > scorpions59
         
        Il ne veut pas de doublon !

        AACD contient 2 fois A
        0
    3. Lmedou
       
      Bonjour,

      Je dois être un peu neuneu, mais cette macro semble parfaitement répondre à mon besoin, mais je ne parviens pas à la faire fonctionner.

      Quelle nom faut il lui donner ? Un Sub Macro2() la fait planter. Pour info, je suis Excel 2007

      Une bonne âme peut elle peut me débloquer ?

      Merci.
      0
    4. Adrien94
       
      Si tu as du mal, tu peux tester le code suivant :

      Sub genererCombinaison()
      'On déclare des variables de types Integer qui stockent le code ASCII de la lettre
      Dim char_number_1, char_number_2, char_number_3, char_number_4 As Integer
      'Variable qui va stocker le résultat de notre combinaison
      Dim macombinaison As String
      'Integer qui compte le nombre de combinaisons
      Dim cmb_id As Integer

      'Initialisation du compteur
      cmb_id = 1

      'la lettre A a pour code ASCII 65
      'la lettre B a pour code ASCII 66
      'la lettre C a pour code ASCII 67
      'la lettre D a pour code ASCII 68

      'On parcourt les lettres de A à D
      For char_number_1 = 65 To 68
      'On parcourt les lettres de A à D
      For char_number_2 = 65 To 68
      'On élimine le cas où les 2 premières lettres sont identiques
      If char_number_2 <> char_number_1 Then
      'On parcourt les lettres de A à D
      For char_number_3 = 65 To 68
      'On élimine les cas suivants :
      ' 3ème lettre = 2ème lettre
      ' 3ème lettre = 1ère lettre
      If char_number_3 <> char_number_2 And char_number_3 <> char_number_1 Then
      'On parcourt les lettres de A à D
      For char_number_4 = 65 To 68
      'On élimine les cas suivants :
      ' 4ème lettre = 3ème lettre
      ' 4ème lettre = 2ème lettre
      ' 4ème lettre = 1ère lettre
      If char_number_4 <> char_number_3 And _
      char_number_4 <> char_number_2 And _
      char_number_4 <> char_number_1 Then
      'On concatène les caractères formés à partir des codes ASCII
      macombinaison = Chr(char_number_1) & Chr(char_number_2) & Chr(char_number_3) & Chr(char_number_4)
      'On affiche le numéro de la combinaison et la chaîne de caractères
      Debug.Print ("Combinaison n°" & Trim(Str(cmb_id)) & " : " & macombinaison)
      'On incrémente le compteur
      cmb_id = cmb_id + 1
      End If
      Next
      End If
      Next
      End If
      Next
      Next char_number_1
      End Sub

      Cette Sub affiche le résultat dans la console de Debug
      0