コード例 #1
0
ファイル: Arbol.cs プロジェクト: Arthyom/C-Xmpls
 public Arbol()
 {
     this.Dims = 0;
     this.Raiz = null;
     this.ColaUsados = new Queue();
     this.PilaSuc = new Stack();
 }
コード例 #2
0
ファイル: Form1.cs プロジェクト: Arthyom/C-Xmpls
        private Estado EstadoInicial()
        {
            string CadenaEntrada = this.textBox1.Text;
            char[] vacio = { '0', '0', '0', '0' };

            Estado EstadoNuevo = new Estado();
            EstadoNuevo.LadoDer = this.radDerIn.Checked;
            EstadoNuevo.LadoIzq = this.radIzqIn.Checked;


            // el lado derecho esta checado
            if (this.radDerIn.Checked)
            {
                EstadoNuevo.CosasLadoDer = CadenaEntrada.ToCharArray();
                EstadoNuevo.CosasLadoIzq = vacio;

             

              
            }
            else
            {
                EstadoNuevo.CosasLadoDer = vacio;
                EstadoNuevo.CosasLadoIzq = CadenaEntrada.ToCharArray();

            }

            return EstadoNuevo;
        }
コード例 #3
0
ファイル: Estado.cs プロジェクト: Arthyom/C-Xmpls
        // constructor por defecto
        public Estado()
        {

             char[] CosasLadoIzq = { 'H', 'M', 'V', 'P' };
             char[] CosasLadoDer = { 'H', 'M', 'V', 'P' };

            this.EstadoVisitado = false;
            this.LadoDer = false;
            this.LadoIzq = false;
            this.EstadoPadre = null;
            this.EstadosHijos = null;
        }
コード例 #4
0
ファイル: Form1.cs プロジェクト: Arthyom/C-Xmpls
 private TreeNode SetRaiz ( Estado EstadoActual)
 {
     if (EstadoActual.LadoDer)
     {
         TreeNode t = new TreeNode(new string(EstadoActual.CosasLadoDer));
         t.BackColor = Color.Red;
         return t;
     }
     else
     {
         TreeNode t = new TreeNode(new string(EstadoActual.CosasLadoIzq));
         t.BackColor = Color.Blue;
         return t;
     }
 }
コード例 #5
0
ファイル: Form1.cs プロジェクト: Arthyom/C-Xmpls
 private TreeNode PonerNodo( TreeNode NodoActual, Estado EstadoActual ) {
     if (EstadoActual.LadoDer)
     {
         TreeNode t = new TreeNode( new string(EstadoActual.CosasLadoDer));
         t.BackColor = Color.Red;
         NodoActual.Nodes.Add(t);
         return t;
     }
     else
     {
         TreeNode t = new TreeNode(new string(EstadoActual.CosasLadoIzq));
         t.BackColor = Color.Blue;
         NodoActual.Nodes.Add(t);
         return t;
     }
 }
コード例 #6
0
ファイル: Arbol.cs プロジェクト: Arthyom/C-Xmpls
        /*
        public static bool operator != ( Estado EstadoEntrada, Estado EstadoFinal ) 
        
            int cosas = 0;
            // comparar 
            if (EstadoEntrada.LadoDer != EstadoFinal.LadoDer && EstadoEntrada.LadoIzq != EstadoFinal.LadoIzq)
            {
                for (int i = 0; i < EstadoFinal.CosasLadoDer.Length; i++)
                {
                    if (EstadoFinal.CosasLadoDer[i] != EstadoEntrada.CosasLadoDer[i] && EstadoFinal.CosasLadoIzq[i] != EstadoEntrada.CosasLadoIzq[i])
                        cosas++;
                }

                if (cosas != EstadoFinal.CosasLadoIzq.Length)
                    return true;
            }

            return false;
        }
        */

        // generar estados sucesores a partir del estado padre 
        public void GenerarSucesores ( Estado EstadoPadre)
        {

            // identificar de que lado esta el estado padre
            Estado[] EstadosHijos = new Estado[4];



            if (EstadoPadre.LadoDer)
            {
                EstadosHijos[0] = Estado.CrearEstadoSimplo('H', EstadoPadre);
                // pasar al nuevo estado al lado izquierdo 
                for (int i = 1; i < EstadosHijos.Length; i++)
                {
                    // crear un nuevo Estado a partir del estado padre
                    EstadosHijos[i] = Estado.GenerarNuevoEstado(EstadoPadre, 'H', i );


                }
            }
            else
            {
                EstadosHijos[0] =  Estado.CrearEstadoSimplo('H', EstadoPadre);
                // pasar al nuevo estado al lado derecho 
                for (int i = 1; i < EstadosHijos.Length; i++)
                {
                    // crear un nuevo Estado a partir del estado padre
                    EstadosHijos[i] = Estado.GenerarNuevoEstado(EstadoPadre, 'H', i );


                }

            }

            // conectar al padre con los hijos y a los hijos con su padre
            EstadoPadre.ConectarEstados(EstadosHijos);

            // agregar los nodos generados a la pila de sucesores 
            foreach (Estado estHijo in EstadosHijos)
            {
                this.PilaSuc.Push(estHijo);
                this.Dims += 1;

            }      
        }
コード例 #7
0
ファイル: Arbol.cs プロジェクト: Arthyom/C-Xmpls
        // sobre cargar el operador ==
        public  bool Comparar ( Estado EstadoEntrada, Estado EstadoFinal )
        {
            int cosas = 0;
            // comparar 
            if (EstadoEntrada.LadoDer == EstadoFinal.LadoDer && EstadoEntrada.LadoIzq == EstadoFinal.LadoIzq)
            {
                for(int i = 0; i < EstadoFinal.CosasLadoDer.Length; i ++)
                {
                    if (EstadoFinal.CosasLadoDer[i] == EstadoEntrada.CosasLadoDer[i] && EstadoFinal.CosasLadoIzq[i] == EstadoEntrada.CosasLadoIzq[i])
                        cosas++;
                }

                if (cosas == EstadoFinal.CosasLadoIzq.Length)
                    return true;
            }

            return false;

        }
コード例 #8
0
ファイル: Estado.cs プロジェクト: Arthyom/C-Xmpls
        // construir un nuevo estado a partir de otro
        public static Estado CopiarEstado ( Estado EstadoPadre)
        {
            Estado EstadoCopia = new Estado();
            EstadoCopia.EstadoVisitado = EstadoPadre.EstadoVisitado;
            EstadoCopia.LadoDer = EstadoPadre.LadoDer;
            EstadoCopia.LadoIzq = EstadoPadre.LadoIzq;

            char[] arcDer = new char[4];
            char[] arcIzq = new char[4];

            for (int i = 0; i < EstadoPadre.CosasLadoDer.Length; i++)
                arcDer[i] = EstadoPadre.CosasLadoDer[i];

            for (int i = 0; i < EstadoPadre.CosasLadoDer.Length; i++)
                arcIzq[i] = EstadoPadre.CosasLadoIzq[i];

            EstadoCopia.CosasLadoDer = arcDer;
            EstadoCopia.CosasLadoIzq = arcIzq;

            return EstadoCopia;     
        }
コード例 #9
0
ファイル: Estado.cs プロジェクト: Arthyom/C-Xmpls
        // construir un nuevo estado, moviendo a homero solo al lado indicado
        public static Estado CrearEstadoSimplo(char Homero, Estado EstadoPadre)
        {
            Estado NuevoEstado = Estado.CopiarEstado(EstadoPadre);

            // verificar de que lado esta el estado padre
            if ( EstadoPadre.LadoDer )
            {
                
                // mover a homero al lado izquiero
                NuevoEstado.CosasLadoIzq[0] = 'H';
                NuevoEstado.CosasLadoDer[0] = '0';
                NuevoEstado.CambiarEstado();
            }
            else
            {
                // mover a homero al lado derecho
                NuevoEstado.CosasLadoIzq[0] = '0';
                NuevoEstado.CosasLadoDer[0] = 'H';
                NuevoEstado.CambiarEstado();

            }
            return NuevoEstado;
        }
コード例 #10
0
ファイル: Arbol.cs プロジェクト: Arthyom/C-Xmpls
        // ver si el estado extraido ya fue usado
        public bool BuscarEstadoUsado ( Estado EstadoExtraido)
        {
            
            if (ColaUsados.Count == 0)
                return false;

            // COMPARAR ESTADOS CON EL ESTADO EXTRAIDO
            foreach (Estado E in this.ColaUsados)
            {
                string cadDer = new string(E.CosasLadoDer);
                string cadIzq = new string(E.CosasLadoIzq);

                if ( cadDer.CompareTo( new string(EstadoExtraido.CosasLadoDer)) == 0&& cadIzq.CompareTo(new string(EstadoExtraido.CosasLadoIzq)) ==0)
                {
                    if (E.LadoDer == EstadoExtraido.LadoDer && E.LadoIzq == EstadoExtraido.LadoIzq)
                        return true;
                }
            }

          
            return false;
        }
コード例 #11
0
ファイル: Arbol.cs プロジェクト: Arthyom/C-Xmpls
        public bool Reglas ( Estado EstadoExtraido)
        {

     
            int peligroD = 0, cuentaD = 0;
            int peligroI = 0, cuentaI = 0;

            // VER SI HOMERO ESTA DE UN LADO
            if (!EstadoExtraido.CosasLadoIzq.Contains('H'))
            {
                // ver si el lado esta vacio
                foreach (char c in EstadoExtraido.CosasLadoIzq)
                    if (c == '0')
                        cuentaI += 1;
                if (cuentaI == EstadoExtraido.CosasLadoIzq.Length)
                    peligroI = 0;
                else
                {
                    // si homero no esta y no esta vacio, estan magui, el perro o el veneno
                    if (EstadoExtraido.CosasLadoIzq.Contains('M'))
                    {
                        foreach (char c in EstadoExtraido.CosasLadoIzq)
                            if (c == 'P' || c == 'V')
                                peligroI += 1;
                    }
                    else
                        peligroI = 0;

                        
                }
               

            }
            else
                peligroI = 0;

            // VER SI HOMERO ESTA DE UN LADO
            if (!EstadoExtraido.CosasLadoDer.Contains('H'))
            {
                // ver si el lado esta vacio
                foreach (char c in EstadoExtraido.CosasLadoDer)
                    if (c == '0')
                        cuentaD += 1;
                if (cuentaD == EstadoExtraido.CosasLadoDer.Length)
                    peligroD = 0;
                else
                {
                    // si homero no esta y no esta vacio, estan magui, el perro o el veneno
                    if (EstadoExtraido.CosasLadoDer.Contains('M'))
                    {
                        foreach (char c in EstadoExtraido.CosasLadoDer)
                            if (c == 'P' || c == 'V')
                                peligroD += 1;
                    }
                    else
                        peligroD = 0;

                }
            }
            else
                peligroD = 0;

            if (peligroD == 0 && peligroI == 0)
                return true;

            return false;
        }
コード例 #12
0
ファイル: Arbol.cs プロジェクト: Arthyom/C-Xmpls
 public void InsertarRaiz ( Estado Raiz)
 {
     this.Raiz = Raiz;
     this.PilaSuc.Push(Raiz);
 }
コード例 #13
0
ファイル: Form1.cs プロジェクト: Arthyom/C-Xmpls
        private void GraficarEstado ( Estado ArbolRaiz, int x, int y )
        {
            // imprimir arbol nodo a nodo
            if (ArbolRaiz.EstadosHijos != null)
            {

                /** imprimir el nodo qe ha sido visitado **/
                Label l = new Label();
            l.Location = new System.Drawing.Point(x, y);
            l.Size = new System.Drawing.Size(70, 30);
                l.AutoSize = true;
                l.Font = new Font(textBox1.Font.Name, 10, FontStyle.Bold);
                l.ForeColor = Color.White;


            if (ArbolRaiz.LadoDer)
            {
                l.BackColor = Color.Red;
                l.Text = " lado Der -> " + new string(ArbolRaiz.CosasLadoDer) +" lado Izq-> " + new string (ArbolRaiz.CosasLadoIzq);

            }

            else
            {
                l.BackColor = Color.Blue;
                l.Text = " Lado Izq -> " + new string(ArbolRaiz.CosasLadoIzq) + " Lado Der -> " + new string (ArbolRaiz.CosasLadoDer);
            }
              

            GTree.Controls.Add(l);
           
                foreach (Estado E in ArbolRaiz.EstadosHijos)
                {
                    x += 30;
                    y += 10;
                    if (E != null)
                    GraficarEstado(E, x, y);
                }
            }
        }
コード例 #14
0
ファイル: Form1.cs プロジェクト: Arthyom/C-Xmpls
 private void ImprimirEstado( Estado EstadoHijo)
 {
     string salida;
     if (EstadoHijo != null)
     {
         if (EstadoHijo.LadoDer)
         {
             salida = new string(EstadoHijo.CosasLadoDer);
             MessageBox.Show(" Estado ->>" + salida + " " + " lado D ", "lISTA DE SOLUCION");
         }
         else
         {
             salida = new string(EstadoHijo.CosasLadoIzq);
             MessageBox.Show(" Estado ->>" + salida + " " + " lado I ", "lISTA DE SOLUCION");
         }
     }
 }
コード例 #15
0
ファイル: Form1.cs プロジェクト: Arthyom/C-Xmpls
        private void GrafObliga(Estado ArbolRaiz,int x, int y)
        {
            /** imprimir el nodo qe ha sido visitado **/
            Label l = new Label();
            l.Location = new System.Drawing.Point(x, y);
            l.Size = new System.Drawing.Size(70, 30);
            l.AutoSize = true;
            l.Font = new Font(textBox1.Font.Name, 10, FontStyle.Bold);
            l.ForeColor = Color.White;


            if (ArbolRaiz.LadoDer)
            {
                l.BackColor = Color.Red;
                l.Text = " lado Der -> " + new string(ArbolRaiz.CosasLadoDer) + " lado Izq-> " + new string(ArbolRaiz.CosasLadoIzq);

            }

            else
            {
                l.BackColor = Color.Blue;
                l.Text = " Lado Izq -> " + new string(ArbolRaiz.CosasLadoIzq) + " Lado Der -> " + new string(ArbolRaiz.CosasLadoDer);
            }


            GTree.Controls.Add(l);
        }
コード例 #16
0
ファイル: Form1.cs プロジェクト: Arthyom/C-Xmpls
 private void GetPapi (Estado EstadoHijo)
 {
     if ( EstadoHijo != null)
     {           
         this.ImprimirEstado(EstadoHijo);
         this.GetPapi(EstadoHijo.EstadoPadre);
     }
             
 }
コード例 #17
0
ファイル: Estado.cs プロジェクト: Arthyom/C-Xmpls
        // mover una pieza, la barca y a homero del lado adecuado
        public static Estado GenerarNuevoEstado(Estado EstadoPadre, char Homero, int ObjetoMover)
        {
            Estado EstadoCopia = Estado.CopiarEstado(EstadoPadre);

            // mover a homero junto con algun obejto y la barca al aldo contrario
            if (EstadoPadre.LadoDer)
            {
                // mover a homero
                EstadoCopia.CosasLadoDer[0] = '0';
                EstadoCopia.CosasLadoIzq[0] = 'H';

                // mover alguna de las cosas de lado derecho al izquierdo
                if(EstadoCopia.CosasLadoDer[ObjetoMover] != '0')
                {
                    EstadoCopia.CosasLadoIzq[ObjetoMover] = EstadoCopia.CosasLadoDer[ObjetoMover];
                    EstadoCopia.CosasLadoDer[ObjetoMover] = '0';
                }
                else
                    return null;
                

                // cambiar la bandera del estado
                EstadoCopia.CambiarEstado();
            }
            else
            {
                // mover a homero
                EstadoCopia.CosasLadoDer[0] = 'H';
                EstadoCopia.CosasLadoIzq[0] = '0';

                // mover alguna de las cosas de lado izquierdo al derecho
                // mover alguna de las cosas de lado derecho al izquierdo
                if (EstadoCopia.CosasLadoIzq[ObjetoMover] != '0')
                {
                    EstadoCopia.CosasLadoDer[ObjetoMover] = EstadoCopia.CosasLadoIzq[ObjetoMover];
                    EstadoCopia.CosasLadoIzq[ObjetoMover] = '0';
                }
                else
                    return null;


                // cambiar la bandera del estado
                EstadoCopia.CambiarEstado();

            }

            return EstadoCopia;
        }
コード例 #18
0
ファイル: Arbol.cs プロジェクト: Arthyom/C-Xmpls
 // meter a la cola de usados
 public void EncolarEstado ( Estado EstadoGenerado)
 {
     this.ColaUsados.Enqueue(EstadoGenerado);
 }
コード例 #19
0
ファイル: Estado.cs プロジェクト: Arthyom/C-Xmpls
        // conectar al estado padre con los estado hijos 
        public void ConectarEstados ( Estado [] EstadosHijos)
        {
            // conectar al padre con sus hijos 
            this.EstadosHijos = EstadosHijos;

            // conectar al cada uno de los hijos con su padre
            for (int i = 0; i < EstadosHijos.Length; i++)
                if(EstadosHijos[i] != null)
                    EstadosHijos[i].EstadoPadre = this;
                
        }