public Arbol() { this.Dims = 0; this.Raiz = null; this.ColaUsados = new Queue(); this.PilaSuc = new Stack(); }
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; }
// 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; }
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; } }
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; } }
/* 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; } }
// 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; }
// 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; }
// 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; }
// 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; }
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; }
public void InsertarRaiz ( Estado Raiz) { this.Raiz = Raiz; this.PilaSuc.Push(Raiz); }
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); } } }
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"); } } }
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); }
private void GetPapi (Estado EstadoHijo) { if ( EstadoHijo != null) { this.ImprimirEstado(EstadoHijo); this.GetPapi(EstadoHijo.EstadoPadre); } }
// 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; }
// meter a la cola de usados public void EncolarEstado ( Estado EstadoGenerado) { this.ColaUsados.Enqueue(EstadoGenerado); }
// 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; }