Tableau en escalier [Résolu]

edwinzap 159 Messages postés samedi 29 septembre 2012Date d'inscription 21 juin 2016 Dernière intervention - 26 nov. 2014 à 01:21 - Dernière réponse : Whismeril 12117 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 octobre 2018 Dernière intervention
- 27 nov. 2014 à 14:27
Bonjour,
J'ai réalisé un programme qui cherche les solutions à un problème donné.
Chaque solution est stockée dans un tableau de 8 lignes, 1 colonne.
Je voudrais bien sauvegarder les solutions dans un tableau de tableaux.
J'ai écris ceci qui est marqué comme autorisé dans la doc msdn:
            int[][] Solution = new int[][];

Mais j'ai d'office une erreur:
Erreur 2 Nombre d'index incorrect dans [] ; 1 attendu


Merci de m'aider svp !

Edit: ce n'est pas autorisé en fait mais je n'ai tjrs pas de solution
Afficher la suite 

Votre réponse

14 réponses

BunoCS 14176 Messages postés lundi 11 juillet 2005Date d'inscriptionModérateurStatut 19 octobre 2018 Dernière intervention - 26 nov. 2014 à 09:17
0
Merci
Hello,

Il n'y aurait pas une virgule entre les accolades?
http://msdn.microsoft.com/fr-fr/library/2yd9wwz4.aspx
edwinzap 159 Messages postés samedi 29 septembre 2012Date d'inscription 21 juin 2016 Dernière intervention - 26 nov. 2014 à 10:05
Je voudrais faire un tableau de tableaux et non un tableau à plusieurs colonnes...
edwinzap 159 Messages postés samedi 29 septembre 2012Date d'inscription 21 juin 2016 Dernière intervention - 26 nov. 2014 à 10:32
J'utilise finalement une list<int[]> pour y mettre tout mes tableaux mais je n'arrive pas à récupérer le contenu d'un tableau de la liste
Commenter la réponse de BunoCS
NHenry 14274 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 18 octobre 2018 Dernière intervention - 26 nov. 2014 à 12:37
0
Merci
En C#, il y a la possibilité de déclarer avec "var" :
var MaList=new List<int[]>
var MonTab=MaList.ToArray();

Sinon, si tu déclare un tableau multidimensionnel, pas besoin des bornes, mais pour un "new" il te faut opbligatoirement les bornes
edwinzap 159 Messages postés samedi 29 septembre 2012Date d'inscription 21 juin 2016 Dernière intervention - 26 nov. 2014 à 19:06
Pour récapituler, j'ai à chaque fois un tableau de 8 lignes contenant les valeurs. Je souhaiterais sauvegarder ses données pour pouvoir les réutiliser par la suite. Que dois-je utiliser finalement? Sachant que si je choisi un élément, je souhaiterais pouvoir récupérer les 8 valeurs.
NHenry 14274 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 18 octobre 2018 Dernière intervention - 26 nov. 2014 à 19:32
As-tu essayé ma suggestion ?
edwinzap 159 Messages postés samedi 29 septembre 2012Date d'inscription 21 juin 2016 Dernière intervention - 26 nov. 2014 à 19:41
Oui mais je ne sais pas comment aller chercher les valeurs au bon endroit ! J'ai cherché mais je n'ai pas trouvé car je ne sais pas comment le .toarray ajoute à la liste
edwinzap 159 Messages postés samedi 29 septembre 2012Date d'inscription 21 juin 2016 Dernière intervention - 26 nov. 2014 à 19:46
Si je fais ceci, je récupère des valeurs mais je ne sais pas quelles valeurs !
            Console.WriteLine(Solution[735][0]);
            Console.ReadLine();

De plus, j'avais 92 tableaux de 8 lignes. Maintenant j'ai 736 éléments.
NHenry 14274 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 18 octobre 2018 Dernière intervention - 26 nov. 2014 à 20:57
Selon ton code, tu récupères le 736ième élément (base 0) et la première valeur de cet élément.
Commenter la réponse de NHenry
Whismeril 12117 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 octobre 2018 Dernière intervention - 26 nov. 2014 à 20:46
0
Merci
Bonsoir, pour répondre à ta premiere question, pour initier un tableau il faut lui dire le nombre d'enregistrements, ce point est acquis puisque tu le fais quelque par dans ton code. Et bien un tableau de tableaux c'est pareil...
int[][] = new int[8][8];

Cependant la liste c'est bien mieux

Je ne peux pas tester ton code ce soir, mais je peux déjà simplifier un point, si tu veux faire une string à partir des éléments d'un tableau, il faut utiliser la méthode String.Join.

Je pense comme NHenry que Table étant passée par référence, et bien chaque il n'y en a en fait qu'une qui représente le dernier résultat trouvé. Pour éviter ça il faut faire un new list... à chaque nouvelle recherche.


Maintenant de façon plus générale, C# est un langage "tout" objet et si tu veux faire un jeu d'échec la base serait d'utiliser autant d'objets que de type de pièce, ceux ci se caractériseraient par leur position, déplacement et prise(au moins pour les pions puisque pas dans le sens du déplacement).
Et là dans ton code pas d'objet....
Commenter la réponse de Whismeril
edwinzap 159 Messages postés samedi 29 septembre 2012Date d'inscription 21 juin 2016 Dernière intervention - 26 nov. 2014 à 21:53
0
Merci
Merci à tous,
Vous m'avez mis sur quelques pistes et c'est là l'essentiel !

J'utilise finalement une liste de tableaux:
            List<int[]> Solution = new List<int[]>();


Et j'ajoute les tableaux:
{  int[] nouvelle = new int[8];
    nouvelle = (int[]) Table.Clone();
    Solution.Add(nouvelle);
     }
Commenter la réponse de edwinzap
Whismeril 12117 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 octobre 2018 Dernière intervention - 27 nov. 2014 à 14:27
0
Merci
Bonjour, j'ai eu un peu de temps voici ma proposition (attention je n'ai pas chercher à optimiser tes boucles!), mes commentaires commencent par "Whismeril:"

            //Stopwatch permet de calculer des intervalles de temps, utilisé ici pour calculer le temps mis par l'ordinateur pour touver toutes les solutions
            Stopwatch sw = new Stopwatch();
            sw.Start();

            // Tableau de 8 lignes, 1 colonnes
            //int[] Table = new int[8]; Whismeril: une seule référence d'ou ton problème précédent
            List<int[]> Solution = new List<int[]>();

            // Pour réussir à trouver les différentes possibilités, j'utilise le système suivant:
            // Les lignes du tableau réprésentent une colonne du plateau d'échec. Le nombre indiqué représente la ligne
            // Ainsi, pour teste toutes les possibilités, je dois tester toutes les séries de chiffres de 00000000 à 88888888

            //Les boucles ci-dessous incrémentent les valeurs de chaque ligne
            for (int a = 0; a < 8; a++) // boucle n°0, incrémente la ligne '0'
            {
                int[] Table = new int[8];//Whismeril : ici c'est mieux
                Table[0] = a;
                for (int b = 0; b < 8; b++) // boucle n°1, incrémente la ligne '1'
                {
                    Table[1] = b;
                    for (int c = 0; c < 8; c++) // boucle n°2, incrémente la ligne '2'
                    {
                        Table[2] = c;
                        for (int d = 0; d < 8; d++) // boucle n°3, incrémente la ligne '3'
                        {
                            Table[3] = d;
                            for (int e = 0; e < 8; e++) // boucle n°4, incrémente la ligne '4'
                            {
                                Table[4] = e;
                                for (int f = 0; f < 8; f++) // boucle n°5, incrémente la ligne '5'
                                {
                                    Table[5] = f;
                                    for (int g = 0; g < 8; g++) // boucle n°6, incrémente la ligne '6'
                                    {
                                        Table[6] = g;
                                        for (int h = 0; h < 8; h++) // boucle n°7, incrémente la ligne '7'
                                        {
                                            Table[7] = h;

                                            // une des condition est qu'il n'y ai pas 2 reines sur la même ligne
                                            // la boucle suivante vérifie s'il y a des chiffres identiques

                                            int m = 0;
                                            bool condition1 = true;
                                            while (m < 8 & condition1 == true)// tant que 'm' est plus petit que 8 et que condition1 (aucun chiffres identique) est vraie, exécuter le bloc                                                
                                            {
                                                int n = m + 1;
                                                while (n < 8 & condition1 == true) // tant que 'n' est plus petit que 8 et que condition1 (aucun chiffres identique) est vraie, exécuter le bloc
                                                {
                                                    if (Table[m] == Table[n]) // Vérifie si le chiffre se trouvant à la ligne 'm' du tableau est égale à celui ce trouvant à la ligne 'n'
                                                    {
                                                        condition1 = false; // si vrai, alors condition1 est fausse
                                                    }
                                                    n++;
                                                }
                                                m++;
                                            }
                                            if (condition1 == true) // si la condition1 est vraie, tester la condition2
                                            {
                                                //Console.WriteLine("{0} | {1} | {2} | {3} | {4} | {5} | {6} | {7}" + condition1, Table[0], Table[1], Table[2], Table[3], Table[4], Table[5], Table[6], Table[7]);
                                                //Console.ReadLine();

                                                // la boucle suivante vérifie les diagonales
                                                // Pour cela il faut calculer l'écart entre le premier chiffre et le deuxième et ajouter cet écart au chiffre
                                                // Si le premier chiffre avec ajout (et retrait) de l'écart égale le deuxième chiffre, alors les 2 reines sont sur une même diagonale
                                                // Ajouter l'écart vérifie la diagonale vers le bas
                                                // Soustraire l'écart vérifie la diagonale vers le haut
                                                int o = 0;
                                                bool condition2 = true;
                                                while (o < 8 & condition2 == true)
                                                {
                                                    int p = o + 1;
                                                    while (p < 8 & condition2 == true)
                                                    {
                                                        if ((Table[o] + Math.Abs(o - p)) == Table[p] | (Table[o] - Math.Abs(o - p)) == Table[p])
                                                            condition2 = false;
                                                        p++;
                                                    }
                                                    o++;
                                                }
                                                if (condition2 == true) // Si condition2 est également vraie alors le résultat est une solution possible !
                                                {
                                                    //Solution.Add((int [])Table.Clone()); Whismeril: à éviter, un tableau de 8 entiers ça n'est pas compliqué mais si tu fait ça avec un objet plus complexe tu va perdre du temps d'exécution à creer une copie et la caster.
                                                    Solution.Add(Table);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }



            sw.Stop();
            TimeSpan ts = sw.Elapsed; // ts est une mesure de temps et contient le temps nécessaire pour calculer les solutions.
            Console.WriteLine("Temps d'exécution: " + ts);
            Console.ReadLine();
            Console.WriteLine("Nombre de solution: " + Solution.Count());
            Console.ReadLine();


            for (int z = 0; z < Solution.Count(); z++)
            {
                int[] Tableau = Solution[z];
                //Console.WriteLine("Table: {0} | {1} | {2} | {3} | {4} | {5} | {6} | {7} /" + z, Tableau[0], Tableau[1], Tableau[2], Tableau[3], Tableau[4], Tableau[5], Tableau[6], Tableau[7]); Whismeril: voir en dessous
                Console.WriteLine(string.Format("Table: {0} | {1} /",z, string.Join(" |", Tableau)));//Whismeril: c'est plus propre
            }
            Console.ReadLine();

Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.