RECHERCHE DES COMBINAISONS POUR LE JEU DES NOMBRES FLÉCHÉS
Vb Lover
Messages postés221Date d'inscriptionvendredi 30 novembre 2001StatutMembreDernière intervention13 février 2010
-
12 févr. 2004 à 18:06
mbash
Messages postés3Date d'inscriptionjeudi 13 mai 2004StatutMembreDernière intervention21 mai 2004
-
14 mai 2004 à 18:40
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
mbash
Messages postés3Date d'inscriptionjeudi 13 mai 2004StatutMembreDernière intervention21 mai 2004 14 mai 2004 à 18:40
Excellente la récursivité. Cependant je recherche un peu la même chose, mais cette fois en incluant le 0 et les éléments tous supérieurs ou égaux quand triés par ordre croissant). Par exemple je veux trouver pour la somme 5 les quintuplets suivants : (00005),(00014),(00023),(00113),(00122),(01112)et(11111).
Une idée ?
Vb Lover
Messages postés221Date d'inscriptionvendredi 30 novembre 2001StatutMembreDernière intervention13 février 20105 12 févr. 2004 à 19:16
et voilà !!
' -------------------------------------------------------------------
' Nom : Combinaisons
' Desc : Cherche k nombres différents, inférieurs ou égaux à N,
' tels que leur somme soit égale à Somme
' -------------------------------------------------------------------
Private Sub Combinaisons( _
ByVal Somme As Integer, ByVal k As Integer, ByVal N As Integer, _
Optional ByVal strComb As String = "")
Dim Min As Integer, Max As Integer
Dim i As Integer
Min = k * (k + 1) / 2
Max = (N + 1) * k - Min
If Somme < Min Or Somme > Max Then ' somme possible ou non
If strComb = "" Then MsgBox "Somme impossible à trouver"
Exit Sub
End If
If k = 1 Then ' fin de la récursivité
If Somme <= N Then ' combinaison trouvée
strComb = strComb & CStr(Somme)
frmMain.Print strComb
End If
Else ' lance la récursivité
Max = Somme - k * (k - 1) / 2
Min = (2 * Somme - Max) / k
For i = Max To Min Step -1
Combinaisons Somme - i, k - 1, i - 1, _
strComb & CStr(i) & ","
Next
End If
End Sub
' ------------------------------------------------------------
il est un peu plus court, non ?? et il n'est pas limité aux chiffres de 1 à 9 !
Pour ton cas, il suffit de lancer
Combinaisons Somme, nombre_chiffre, 9
et au lieu de faire print... de les mettre dans ta listBox
Vb Lover
Messages postés221Date d'inscriptionvendredi 30 novembre 2001StatutMembreDernière intervention13 février 20105 12 févr. 2004 à 18:06
Je suis en train de programmé la méthode récursive. Mais auparavant je tiens à te proposer une modification simple :
quand tu testes si la somme est trop grande/petite pour le nombre de chiffres donnés, tu peux utiliser la relation :
14 mai 2004 à 18:40
Une idée ?
12 févr. 2004 à 19:16
' -------------------------------------------------------------------
' Nom : Combinaisons
' Desc : Cherche k nombres différents, inférieurs ou égaux à N,
' tels que leur somme soit égale à Somme
' -------------------------------------------------------------------
Private Sub Combinaisons( _
ByVal Somme As Integer, ByVal k As Integer, ByVal N As Integer, _
Optional ByVal strComb As String = "")
Dim Min As Integer, Max As Integer
Dim i As Integer
Min = k * (k + 1) / 2
Max = (N + 1) * k - Min
If Somme < Min Or Somme > Max Then ' somme possible ou non
If strComb = "" Then MsgBox "Somme impossible à trouver"
Exit Sub
End If
If k = 1 Then ' fin de la récursivité
If Somme <= N Then ' combinaison trouvée
strComb = strComb & CStr(Somme)
frmMain.Print strComb
End If
Else ' lance la récursivité
Max = Somme - k * (k - 1) / 2
Min = (2 * Somme - Max) / k
For i = Max To Min Step -1
Combinaisons Somme - i, k - 1, i - 1, _
strComb & CStr(i) & ","
Next
End If
End Sub
' ------------------------------------------------------------
il est un peu plus court, non ?? et il n'est pas limité aux chiffres de 1 à 9 !
Pour ton cas, il suffit de lancer
Combinaisons Somme, nombre_chiffre, 9
et au lieu de faire print... de les mettre dans ta listBox
12 févr. 2004 à 18:06
quand tu testes si la somme est trop grande/petite pour le nombre de chiffres donnés, tu peux utiliser la relation :
1+2+3+...+k = k*(k+1) / 2
donc :
Min = k*(k+1) / 2
Max = 10*k - Min
ça t'évitera de faire des boucles !