示例#1
0
        public void ChargerFichier(string pathFichier, bool verbeuxActif)
        {
            verbeux = verbeuxActif;
                try
                {

                    StreamReader lecteur = new StreamReader(pathFichier);

                    while (lecteur.Peek() > -1)
                    {
                        Grille unSudoku = null;

                        Console.WriteLine(lecteur.ReadLine());//---------------------------------------
                        string nomSud = lecteur.ReadLine();//Nom du sudoku
                        string dateSud = lecteur.ReadLine();//Date du Sudoku
                        string strClé = lecteur.ReadLine();//Récupération de la clé du Sudoku
                        int taille = strClé.Length;//Détermine les dimensions du Sudoku

                        unSudoku = new Grille(nomSud, dateSud, strClé);

                        mesages = unSudoku.afficherDétails();
                        Console.WriteLine(mesages);

                        for (int i = 0; i < taille; i++)
                        {
                            int j = 0;
                            foreach (char valeur in lecteur.ReadLine())
                            {
                                CaseSud newCase = new CaseSud(i, j++);

                                if (valeur == '.')
                                {
                                    newCase.addHypotheses(strClé);
                                }
                                else
                                    newCase.Valeur = valeur;

                                unSudoku.addCaseSud(newCase);
                            }
                        }

                        this.ListeGrilles.Add(unSudoku);

                    }
                    Console.Read();
                }
                catch (Exception)
                {

                    throw;
                }
        }
示例#2
0
        //Fonction de vérification de chaque Lignes du Sudoku passé en paramètre [Valable pour tout les Sudokus 2D]
        private bool VérifLignes(Grille g)
        {
            for (int i = 0; i < g.Taille; i++)
            {
                Dictionary<char, int> CléCompteur = new Dictionary<char, int>();

                foreach (char symbole in g.Symboles)
                {
                    CléCompteur.Add(symbole,0);
                }

                for (int j = 0; j < g.Taille; j++)
                {
                    char s=g.Tab[i,j].Valeur;

                    if (CléCompteur.ContainsKey(s))
                    {
                        if (CléCompteur[s] == 0)
                        {
                            CléCompteur[s]++;
                        }
                        else
                        {
                            Console.WriteLine("\n  =>Ce sudoku N'EST PAS VALIDE!!!! ERREUR Á LA LIGNE {0}", i + 1);
                            return false;
                        }
                    }
                    else
                    {
                        Console.WriteLine("\n  =>Ce sudoku N'EST PAS VALIDE!!!! [{0}] NE FAIT PAS PARTIT DE LA CLÉ", s);
                        return false;
                    }
                }
                CléCompteur.Clear();
            }
            return true;
        }
示例#3
0
        //Fonction de vérification de chaque Régions du Sudoku passé en paramètre [Valable uniquement pour Sudoku 9X9 ]
        private bool VérifRégions(Grille g)
        {
            int débuti = 0;
            do
            {
                int tailleRegion = (int)Math.Sqrt(g.Symboles.Length);
                int débutj = 0;
                int finI = débuti + tailleRegion;

                do
                {
                    Dictionary<char, int> CléCompteur = new Dictionary<char, int>();
                    foreach (char symbole in g.Symboles)
                    {
                        CléCompteur.Add(symbole, 0);
                    }

                    int finJ = débutj + tailleRegion;
                    for (int i = débuti; i < finI; i++)
                    {
                        for (int j = débutj; j < finJ; j++)
                        {
                            char num = g.Tab[i,j].Valeur;
                            if (CléCompteur.ContainsKey(num))
                            {
                                if (CléCompteur[num] == 0)
                                {
                                    CléCompteur[num]++;
                                }
                                else
                                {
                                    Console.WriteLine("\n =>Ce sudoku N'EST PAS VALIDE!!!!");
                                    return false;
                                }
                            }
                            else
                            {
                                Console.WriteLine("\n =>Ce sudoku N'EST PAS VALIDE!!!! [{0}] NE FAIT PAS PARTIT DE LA CLÉ", num);
                                return false;
                            }
                        }
                    }
                    débutj += tailleRegion;
                    CléCompteur.Clear();
                } while (débutj <= g.Taille);
                débuti += tailleRegion;
            } while (débuti <= g.Taille);

            return true;
        }
示例#4
0
 private bool sudBacktracking(Grille g)
 {
     return true;
 }
示例#5
0
        private bool RésoudreRégions(Grille grille)
        {
            bool régionValider = true;//Permet de savoir si toutes les régions ont étés remplies

                Console.WriteLine("\n---------------------------REGIONS--------------------------------------");

                int tailleRegion = (int)Math.Sqrt(grille.Taille);//case 9*9 =3
                int indexFinL = tailleRegion;
                int indexDébutL = 0;
                int indexDébutC = indexDébutL;
                int indexFinC = tailleRegion;
                List<char> caracterePresent = new List<char>();

                do
                {

                    goto DébutRégion;

                DébutRégion:

                    //Si tous les caractères de la grille n'ont pas étés trouvés dans la région

                    do
                    {
                        if (caracterePresent.Count == grille.Taille)
                        {
                            régionValider = true;
                            Console.WriteLine("Tous les caractères ont étés trouvés  pour la région [{0};{1}] à [{2};{3}]",
                                indexDébutL, indexDébutC, indexFinL - 1, indexFinC - 1);
                        }
                        else
                        {
                            régionValider = false;
                            for (int i = indexDébutL; i < indexFinL; i++)
                            {
                                for (int j = indexDébutC; j < indexFinC; j++)
                                {
                                    if (grille.Tab[i, j].NbreHypos == 0 && !caracterePresent.Contains(grille.Tab[i, j].Valeur))
                                    {
                                        caracterePresent.Add(grille.Tab[i, j].Valeur);
                                        RésoudreColonne(grille, j);
                                        goto DébutRégion;
                                    }
                                    else if (caracterePresent.Count > 0 && grille.Tab[i, j].NbreHypos > 0)
                                    {
                                        foreach (char carc in caracterePresent)
                                        {
                                            if (grille.Tab[i, j].supprimerHypothese(carc))
                                            {
                                                caracterePresent.Add(grille.Tab[i, j].Valeur);
                                                RésoudreColonne(grille, j);
                                                goto DébutRégion;
                                            }
                                        }
                                    }
                                }
                            }

                            Console.WriteLine("Nombre de caractères trouvés pour la région [{0};{1}] à [{2};{3}] est : {4}\n",
                                   indexDébutL, indexDébutC, indexFinL - 1, indexFinC - 1, caracterePresent.Count);
                        }

                        indexDébutC += tailleRegion;
                        indexFinC += tailleRegion;

                        caracterePresent.Clear();
                    } while (indexFinC <= grille.Taille);

                    indexDébutC = 0;
                    indexFinC = tailleRegion;
                    indexDébutL += tailleRegion;
                    indexFinL += tailleRegion;

                } while (indexFinL <= grille.Taille);

                return régionValider;
        }
示例#6
0
        private void RésoudreLigne(Grille grille, int numLigne)
        {
            List<char> caracterePresent = new List<char>();
                    goto DébutLigne;

                DébutLigne:
                    //Si tous les caractères de la grille ont été trouvés dans la ligne on passe à la ligne suivante
                    if (caracterePresent.Count == grille.Taille)
                    {
                        Console.WriteLine("Tous les caractères ont étés trouvés pour la ligne {0}", numLigne);
                        return;
                    }

                    for (int j = 0; j < grille.Taille; j++)
                    {
                        if (grille.Tab[numLigne, j].NbreHypos == 1 && !caracterePresent.Contains(grille.Tab[numLigne, j].Valeur))
                        {
                            caracterePresent.Add(grille.Tab[numLigne, j].Valeur);
                            goto DébutLigne;
                        }
                        else if (caracterePresent.Count > 0 && grille.Tab[numLigne, j].NbreHypos > 1)
                        {
                            foreach (char carc in caracterePresent)
                            {
                                if (grille.Tab[numLigne, j].supprimerHypothese(carc))
                                {
                                    caracterePresent.Add(grille.Tab[numLigne, j].Valeur);
                                    goto DébutLigne;
                                }
                            }
                        }
                    }

                    Console.WriteLine("Nombre de caractères trouvés pour la ligne {0} est : {1} \n", numLigne, caracterePresent.Count);
        }
示例#7
0
        public bool sudValidation(Grille g)
        {
            foreach (CaseSud c in g.Tab)
            {
                if (c.Valeur == '\0')
                {
                    Console.WriteLine("toutes les cases du sud " + g.Nom + " ne sont pas remplies");
                    return false;
                }
            }

            if (!VérifLignes(g) && !VérifColonnes(g) && !VérifRégions(g))
            {
                Console.WriteLine("Sudo " + g.Nom + " invalide");
                return false;
            }

            Console.WriteLine("Sudo "+g.Nom+" est valide");
            return true;
        }
示例#8
0
        public void RésolutionNormale(Grille g)
        {
            Stopwatch sw = new Stopwatch();
                sw.Start(); // début de la mesure

                RésoudreRégions(g);
                Console.WriteLine(  g.afficherGrille());
                    foreach (CaseSud caseSud in g.Tab)
                    {
                        if (caseSud.NbreHypos != 0)
                        {
                            break;
                        }
                    }

                sw.Stop(); // Fin de la mesure

                Console.WriteLine("\n Ce sudoku a été résolu en {0} millisecondes \n", sw.ElapsedMilliseconds); // Affichage de la mesure
                créerFichierRéso();
        }