示例#1
0
        //determine les fils d'un noeud
        public List <Coutuniforme> getfils()
        {
            string pos  = getposition();
            int    i    = int.Parse(pos[0].ToString());
            int    j    = int.Parse(pos[1].ToString());
            var    list = new List <Coutuniforme>();

            if (i + 1 < size)
            {
                // i+1 permutation
                int[,] m = (int[, ])matrice.Clone();
                int x;
                x           = m[i, j];
                m[i, j]     = m[i + 1, j];
                m[i + 1, j] = x;
                //affecter a une node
                Coutuniforme s = new Coutuniforme();
                s.matrice = m;
                s.size    = size;
                s.arrive  = this.arrive;
                s.Cout    = this.Cout + 1;
                list.Add(s);
            }

            if (i - 1 >= 0)
            {
                // i+1 permutation
                int[,] m = (int[, ])matrice.Clone();
                int x;
                x           = m[i, j];
                m[i, j]     = m[i - 1, j];
                m[i - 1, j] = x;
                //affecter a une node
                Coutuniforme s1 = new Coutuniforme();
                s1.matrice = m;
                s1.size    = size;
                s1.arrive  = this.arrive;
                s1.Cout    = this.Cout + 1;
                list.Add(s1);
            }

            if (j + 1 < size)
            {
                // i+1 permutation
                int[,] m = (int[, ])matrice.Clone();
                int x;
                x           = m[i, j];
                m[i, j]     = m[i, j + 1];
                m[i, j + 1] = x;
                //affecter a une node
                Coutuniforme s2 = new Coutuniforme();
                s2.matrice = m;
                s2.arrive  = this.arrive;
                s2.size    = size;
                s2.Cout    = this.Cout + 1;
                list.Add(s2);
            }

            if (j - 1 >= 0)
            {
                // i+1 permutation
                int[,] m = (int[, ])matrice.Clone();
                int x;
                x           = m[i, j];
                m[i, j]     = m[i, j - 1];
                m[i, j - 1] = x;
                //affecter a une node
                Coutuniforme s3 = new Coutuniforme();
                s3.matrice = m;
                s3.size    = size;
                s3.arrive  = this.arrive;
                s3.Cout    = this.Cout + 1;
                list.Add(s3);
            }
            return(list);
        }
示例#2
0
        static void Main(string[] args)
        {
            //PriorityQueue<Node> ouverture = new PriorityQueue<Node>();

            Console.Title = "Le taquin ";

            Console.BufferHeight    = 300;
            Console.WindowHeight    = 42;
            Console.BackgroundColor = ConsoleColor.DarkBlue;
            Console.ForegroundColor = ConsoleColor.Yellow;

            //Le Menu principal
            Menu();
            int rep = 0;

            do
            {
                Console.SetCursorPosition(40, 15);
                Console.WriteLine("Taper votre choix : ");
                Console.SetCursorPosition(40, 16);
                string Response = Console.ReadLine();
                if (int.TryParse(Response, out rep))
                {
                    rep = int.Parse(Response);
                }
                else
                {
                    Console.Write("Choix incorrecte");
                }
            } while (rep > 3 || rep < 1);


            Console.Clear();

            // La saisie de la taille de la matrice
            int size = 0;

            do
            {
                Console.WriteLine("Donnez la taille de la martice");
                string sz = Console.ReadLine();
                if (int.TryParse(sz, out size))
                {
                    size = int.Parse(sz);
                }
                else
                {
                    Console.Write("Choix incorrecte");
                }
            } while (size == 0);

            //LA saisie de matrice de depart
            var Matrice_depart = new int[size, size];

            Console.WriteLine("Donner la matrice de depart!");
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    Console.WriteLine("Donner M[{0},{1}]", i, j);
                    string s = Console.ReadLine();
                    if (int.TryParse(s, out Matrice_depart[i, j]))
                    {
                        Matrice_depart[i, j] = int.Parse(s);
                    }
                    else
                    {
                        Console.WriteLine("Vous devez saisir une entier");
                        j--;
                    }
                }
            }

            //LA saisie de matrice d'arrive
            var matrice_arrive = new int[size, size];

            Console.WriteLine("Donner la matrice de d'arrivee!");
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    Console.WriteLine("Donner M[{0},{1}]", i, j);
                    string s = Console.ReadLine();
                    if (int.TryParse(s, out matrice_arrive[i, j]))
                    {
                        matrice_arrive[i, j] = int.Parse(s);
                    }
                    else
                    {
                        Console.WriteLine("Vous devez saisir une entier");
                        j--;
                    }
                }
            }

            Console.WriteLine("Matrice d'arrivée");
            Afficher(matrice_arrive, size);

            Console.WriteLine("Matrice de depart");
            Afficher(Matrice_depart, size);
            Console.ReadKey(true);

            if (rep == 1)
            {
                BestFirstSearch firstnode = new BestFirstSearch();
                firstnode.matrice    = Matrice_depart;
                firstnode.arrive     = matrice_arrive;
                firstnode.size       = size;
                firstnode.Heristique = firstnode.calculer_heutstique();
                Console.WriteLine("Heristique" + firstnode.calculer_heutstique());
                Console.WriteLine();
                firstnode.jouer();
            }
            else if (rep == 2)
            {
                Coutuniforme node = new Coutuniforme();
                node.matrice = Matrice_depart;
                node.arrive  = matrice_arrive;
                node.size    = size;
                node.Cout    = 0;
                Console.WriteLine("Cout : " + node.Cout);
                Console.WriteLine();
                node.jouer();
            }
            else if (rep == 3)
            {
                Astar node = new Astar();
                node.matrice    = Matrice_depart;
                node.arrive     = matrice_arrive;
                node.size       = size;
                node.Cout       = 0;
                node.Heristique = node.calculer_heutstique();
                node.Coutheur   = node.Heristique;
                node.jouer();
            }

            Console.ReadKey(true);
        }
示例#3
0
        public void jouer()
        {
            int[,] arrive = this.arrive;
            var fermeture = new List <Coutuniforme>();
            var ouverture = new List <Coutuniforme>();
            //Afficher(Matrice_depart);

            //creation de l'arbre
            Coutuniforme n = new Coutuniforme();

            n.matrice = this.matrice;
            n.Cout    = this.Cout;
            n.size    = this.size;
            var rac    = n;
            var racine = new Coutuniforme();

            racine.matrice = this.arrive;
            ouverture.Add(n);
            //Afficher(Matrice_depart);
            //Console.WriteLine("heuristique :" + n.calculer_heutstique(Matrice_depart));
            List <Coutuniforme> l = new List <Coutuniforme>();

            while (!ouverture.Contains(racine) || fermeture.Count == 0)
            {
                n      = ouverture[0];
                l      = n.getfils();
                n.fils = l;
                foreach (var x in l)
                {
                    for (int i = 0; i < fermeture.Count; i++)
                    {
                        if (fermeture[i].Equals(x))
                        {
                            if (x.Cout <= fermeture[i].Cout)
                            {
                                fermeture.RemoveAt(i);
                            }
                        }
                    }
                    if (!ouverture.Contains(x))
                    {
                        ouverture.Add(x);
                    }
                }
                fermeture.Add(ouverture[0]);
                ouverture.RemoveAt(0);
                ouverture = ouverture.OrderBy(o => o.Cout).ToList();

                //Afficher l'ouverture
                Console.WriteLine("Ouverture");
                foreach (var x in ouverture)
                {
                    Afficher(x.matrice, x.size);
                    Console.WriteLine("Cout :" + x.Cout);
                }


                //affichage de la fermeture
                Console.WriteLine("fermeture");
                foreach (var x in fermeture)
                {
                    Afficher(x.matrice, x.size);
                    Console.WriteLine("Cout :" + x.Cout);
                }
                // Console.ReadKey(true);
                Console.Clear();
            }

            ////Afficher l'ouverture
            //foreach (var y in ouverture)
            //{
            //    Afficher(y.matrice, y.size);
            //}


            ////affichage de la fermeture
            //foreach (var x in fermeture)
            //{
            //    Afficher(x.matrice, x.size);
            //    Console.WriteLine("Cout :" + x.Cout);
            //}
        }