namespace ConsoleApplication_Echec { class Program { static void Main(string[] args) { //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]; 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' { 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(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(); // N'affiche que des 7 !!! 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]); } Console.ReadLine(); } } }
int[][] = new int[8][8];
List<int[]> Solution = new List<int[]>();
{ int[] nouvelle = new int[8]; nouvelle = (int[]) Table.Clone(); Solution.Add(nouvelle); }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question//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();
26 nov. 2014 à 10:05
26 nov. 2014 à 10:32