IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Calcul de combinaisons


Sujet :

C#

  1. #1
    Membre averti Avatar de Vince
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    369
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 369
    Points : 366
    Points
    366
    Par défaut Calcul de combinaisons
    Bonjour,

    Je recherche de l'aide pour écrire un algo qui me conculerai toutes le combinaisons possible.
    Par exemple avec le chiffres 1, 2 et 3 ça donne :
    1
    2
    3
    12
    13
    21
    23
    31
    32
    123
    132
    213
    231
    321
    312
    ...
    Sans répéter deux fois le même chiffre dans la combinaison.

    Merci d'avance de votre aide

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 88
    Points : 81
    Points
    81
    Par défaut
    Je crois que ça marche, mais ça peut être grandement optimisé (notamment l'utilisation d'une List, ce qui est cracra mais rapide) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    static void test(int[] values, List<int> done)
            {
                foreach (int item in done)
                {
                    Console.Write(values[item] + ",");
                }
                Console.WriteLine();
     
                for (int i = 0; i < values.Length; i++)
                {
                    if (done.Contains(i))
                        continue;
     
                    done.Add(i);
                    test(values, done);
                    done.Remove(i);
                }
            }
    voila

    En espérant que ça peut t'aider

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 88
    Points : 81
    Points
    81
    Par défaut
    je précise : values contient ton tableau de valeurs,

    l'appel de la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    test(new int[] { 1, 2, 3, 4 }, new List<int>());
    tu as la liste de toutes les combinaisons avec 1, 2, 3, 4.

    Bonne journée

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 88
    Points : 81
    Points
    81
    Par défaut
    rebonjour,

    Le même algo, en beaucoup mieux écrit, avec un tableau de bool plutot qu'une List :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    static void test(int[] values, bool[] done)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    if(done[i])
                        Console.Write(values[i] + ",");
                }
                Console.WriteLine();
     
                for (int i = 0; i < values.Length; i++)
                {
                    if (done[i])
                        continue;
     
                    done[i]=true;
                    test(values, done);
                    done[i] = false;
                }
            }
    et l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    test(new int[] { 1, 2, 3, 4 }, new bool[]{false,false,false,false});
    Rebonne journée

  5. #5
    Membre averti Avatar de Vince
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    369
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 369
    Points : 366
    Points
    366
    Par défaut
    merci pour ta réponse ArianeV !
    Je vais tester ça...

  6. #6
    Membre averti Avatar de Vince
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    369
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 369
    Points : 366
    Points
    366
    Par défaut
    voilà ce que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public void test(int[] values, bool[] done)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    if (done[i])
                        this.txtResult.Text = this.txtResult.Text + Convert.ToInt32(values[i]) + ",";
                        //Console.Write(values[i] + ",");
                }
                //Console.WriteLine();
                this.txtResult.Text = this.txtResult.Text + "\r\n - ";
     
                for (int i = 0; i < values.Length; i++)
                {
                    if (done[i])
                        continue;
     
                    done[i] = true;
                    test(values, done);
                    done[i] = false;
                }
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
     - 1,
     - 1,2,
     - 1,2,3,
     - 1,2,3,4,
     - 1,2,4,
     - 1,2,3,4,
     - 1,3,
     - 1,2,3,
     - 1,2,3,4,
     - 1,3,4,
     - 1,2,3,4,
     - 1,4,
     - 1,2,4,
     - 1,2,3,4,
     - 1,3,4,
     - 1,2,3,4,
     - 2,
     - 1,2,
     - 1,2,3,
     - 1,2,3,4,
     - 1,2,4,
     - 1,2,3,4,
     - 2,3,
     - 1,2,3,
     - 1,2,3,4,
     - 2,3,4,
     - 1,2,3,4,
     - 2,4,
     - 1,2,4,
     - 1,2,3,4,
     - 2,3,4,
     - 1,2,3,4,
     - 3,
     - 1,3,
     - 1,2,3,
     - 1,2,3,4,
     - 1,3,4,
     - 1,2,3,4,
     - 2,3,
     - 1,2,3,
     - 1,2,3,4,
     - 2,3,4,
     - 1,2,3,4,
     - 3,4,
     - 1,3,4,
     - 1,2,3,4,
     - 2,3,4,
     - 1,2,3,4,
     - 4,
     - 1,4,
     - 1,2,4,
     - 1,2,3,4,
     - 1,3,4,
     - 1,2,3,4,
     - 2,4,
     - 1,2,4,
     - 1,2,3,4,
     - 2,3,4,
     - 1,2,3,4,
     - 3,4,
     - 1,3,4,
     - 1,2,3,4,
     - 2,3,4,
     - 1,2,3,4,
     -
    On retrouve tout le temps 1 2 3 4

    Help

  7. #7
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut
    je verrrais un truc dans le genre :

    • un compteur
    • une conversion en base N
    • un effaceur de nombre comportant deux fois le meme symbole


    C'est un mauvais algo qui manque d'optimisation, mais ca marche bien pour un nombre reduit de chiffre (M).

    En base N sur M chiffres.
    dans ton exemple N = 3, M = 3;

    en pseudo code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for (i=0;1<= N^M;i++)
    {
    var baseN = ChangeBase(i,N);
    if (HasSameSymbole(baseN))
    {
    continue;
    }
    else
    {
    print(baseN);
    }
    }

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 116
    Points : 100
    Points
    100
    Par défaut
    Je viens de modifier le code tout semble fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
            static float[] NumberArray2 = { 4f, 6f, 14f};
     
            /// <summary>
            /// 
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                test(0, NumberArray2, new bool[] { false, false, false });
            }
     
            public static void test(int offset, float[] values, bool[] done)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    if (done[i])
                    {
                        Console.Write(Convert.ToInt32(values[i]) + ",");
                    }
                }
                Console.WriteLine();
     
                for (int i = offset; i < values.Length; i++)
                {
                    if (done[i])
                        continue;
     
                    done[i] = true;
                    test(i, values, done);
                    done[i] = false;
                }
            }
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    4,
    4,6,
    4,6,14,
    4,14
    6,
    6,14,
    14,

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 116
    Points : 100
    Points
    100
    Par défaut
    Et voici la version qui calcule le total de chaque ligne afin de vérifier une valeur précise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            static int iRecurseCounter = 0;
            static float[] NumberArray2 = { 4f, 6f, 14f};
     
            /// <summary>
            /// 
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                   test(0, NumberArray2, new bool[] { false, false, false }, 0);
            }
     
            public static void test(int offset, float[] values, bool[] done, float total)
            {
                iRecurseCounter++;
                float TmpTotal = total;
     
                for (int i = 0; i < values.Length; i++)
                {
                    if (done[i])
                    {
                        TmpTotal += values[i];
                        Console.Write(values[i].ToString() + "-");
                    }
                }
     
                CheckSum(TmpTotal);
                Console.Write("   Total:" + TmpTotal.ToString());
                Console.WriteLine();
     
                for (int i = offset; i < values.Length; i++)
                {
                    if (done[i])
                        continue;
     
                    done[i] = true;
                    test(i, values, done, total);
                    total = 0;
                    done[i] = false;
                }
            }
     
            /// <summary>
            /// 
            /// </summary>
            /// <param name="ValueType"></param>
            /// <returns></returns>
            static bool CheckSum(float ValueType)
            {
                // Liste des valeurs à rechercher
                if ((ValueType == 284.44f) ||
                    (ValueType == 195.16f) ||
                    (ValueType == 508.75f))
                {
                    Console.WriteLine("GOOD\n");
                    return true;
                }
                return false;
            }
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calcul de combinaisons
    Par rFlex dans le forum ALM
    Réponses: 1
    Dernier message: 16/10/2011, 11h54
  2. Calcul des combinaisons entre 2 listes
    Par Anthares dans le forum C#
    Réponses: 16
    Dernier message: 11/02/2011, 08h55
  3. calculer des combinaisons et les afficher
    Par chahinerue6 dans le forum Langage
    Réponses: 8
    Dernier message: 16/04/2010, 02h38
  4. Réponses: 2
    Dernier message: 17/08/2009, 11h58
  5. Réponses: 1
    Dernier message: 24/02/2009, 20h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo