Algo: créer toutes les combinaisons possibles

Résolu/Fermé
Kobaya Messages postés 282 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 10 janvier 2008 - 30 juin 2005 à 16:03
 librequetucrois - 20 févr. 2012 à 11:36
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.

11 réponses

p.legal Messages postés 88 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 21 mars 2008 24
4 juil. 2005 à 17:43
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
Kobaya Messages postés 282 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 10 janvier 2008 214
4 juil. 2005 à 23:00
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
scorpions59
20 mars 2008 à 07:51
desoler il te manque AACD et AADC
-1
p.legal Messages postés 88 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 21 mars 2008 24 > scorpions59
21 mars 2008 à 01:34
Il ne veut pas de doublon !

AACD contient 2 fois A
0
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
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