예제 #1
0
        public void Generer()
        {
            for (int i = 0; i < Grille.NB_CASE_PAR_LIGNE; i++)
            {
                for (int j = 0; j < Grille.NB_CASE_PAR_LIGNE; j++)
                {
                    if (!cases[i, j].GetVariable().EstAssigne())
                    {
                        ContrainteBinaire cb;

                        //Contrainte sur la ligne
                        for (int k = 0; k < Grille.NB_CASE_PAR_LIGNE; k++)
                        {
                            if (k != i)
                            {
                                cb = new ContrainteBinaire(cases[i, j].GetVariable(), cases[k, j].GetVariable(), ContrainteBinaire.Operateur.NOT_EQUAL);
                                if (!contraintes.Contains(cb))
                                {
                                    contraintes.Add(cb);
                                }
                            }
                        }

                        //Contrainte sur la colonne
                        for (int k = 0; k < Grille.NB_CASE_PAR_LIGNE; k++)
                        {
                            if (k != j)
                            {
                                cb = new ContrainteBinaire(cases[i, j].GetVariable(), cases[i, k].GetVariable(), ContrainteBinaire.Operateur.NOT_EQUAL);
                                if (!contraintes.Contains(cb))
                                {
                                    contraintes.Add(cb);
                                }
                            }
                        }

                        //Contrainte sur la région
                        int tmpI = i - (i % 3);
                        int tmpJ = j - (j % 3);
                        for (int k = tmpI; k < tmpI + Grille.NB_CASE_PAR_REGION; k++)
                        {
                            for (int l = tmpJ; l < tmpJ + Grille.NB_CASE_PAR_REGION; l++)
                            {
                                if (i != k && j != l)
                                {
                                    cb = new ContrainteBinaire(cases[i, j].GetVariable(), cases[k, l].GetVariable(), ContrainteBinaire.Operateur.NOT_EQUAL);
                                    if (!contraintes.Contains(cb))
                                    {
                                        contraintes.Add(cb);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
예제 #2
0
        /* Supprime les valeurs inconsistantes */
        public bool SupprimerValeursInconsistantes(Variable v1, Variable v2)
        {
            bool supprime = false;

            ContrainteBinaire cb = this.csp.GetContrainteVariables(v1, v2);

            if (cb != null)
            {
                List <int> tDomaine = new List <int>(v1.GetDomaine());
                foreach (int x in tDomaine)
                {
                    v1.SetAssigne(true);
                    v1.SetValeur(x);

                    bool satisfy = false;

                    foreach (int y in v2.GetDomaine())
                    {
                        if (!v2.EstAssigne())
                        {
                            v2.SetAssigne(true);
                            v2.SetValeur(y);

                            if (cb.estRespecte())
                            {
                                satisfy = true;
                            }

                            v2.SetAssigne(false);
                            v2.SetValeur(0);
                        }
                        else
                        {
                            if (cb.estRespecte())
                            {
                                satisfy = true;
                            }
                        }
                    }

                    if (!satisfy)
                    {
                        v1.SupprimerValeurDomaine(x);
                        supprime = true;
                    }

                    v1.SetAssigne(false);
                    v1.SetValeur(0);
                }
            }

            return(supprime);
        }
예제 #3
0
파일: CSP.cs 프로젝트: Zendolin/Sudoku
        public ContrainteBinaire GetContrainteVariables(Variable v1, Variable v2)
        {
            ContrainteBinaire cb = null;

            foreach (ContrainteBinaire c in contraintes)
            {
                if (c.Contient(v1) && c.Contient(v2))
                {
                    cb = c;
                }
            }

            return(cb);
        }