예제 #1
0
 public void buscarClave(Pagina actual, ref HistorialMov info, int id)
 {
     if (actual != null)
     {
         for (int i = 1; i <= actual.cuenta; i++)
         {
             if (actual.claves[i].idAtaque == id)
             {
                 info = actual.claves[i];
                 return;
             }
             else if (id < actual.claves[i].idAtaque)
             {
                 buscarClave(actual.ramas[i - 1], ref info, id); // el ramas[i-1] bajo por las ramas izq una anterior
             }
             else if (id > actual.claves[i].idAtaque)
             {
                 buscarClave(actual.ramas[i], ref info, id);  //busco en la rama[i] que seria la actual pero seria de lado derecho
             }
             else
             {
                 info = null;
             }
         }
     }
     else
     {
         info = null;
     }
 }
예제 #2
0
        public bool buscarPagina(Pagina actual, HistorialMov hm, ref int k)
        {
            /* tomar en cuenta que k es la direccion de las ramas por las cuales baja la busqueda*/
            bool         encontrado = false;
            HistorialMov tmp        = actual.claves[1];

            if (hm.idAtaque < actual.claves[1].idAtaque)
            {
                k          = 0;
                encontrado = false;
            }
            else /*examinar la claves del nodo en orden descendente*/
            {
                k = actual.cuenta;
                while ((hm.idAtaque < actual.claves[k].idAtaque) && (k > 1))
                {
                    tmp = actual.claves[k];
                    k--;
                }
                if (hm.idAtaque == actual.claves[k].idAtaque)
                {
                    encontrado = true;
                }
                else
                {
                    encontrado = false;
                }
                tmp = actual.claves[k];
            }
            return(encontrado);
        }
예제 #3
0
        public void empujar(Pagina actual, HistorialMov hm, ref bool subeArriba, ref HistorialMov mediana, ref Pagina nuevo)
        {
            int k = 0;

            if (actual == null)
            {
                subeArriba = true;
                mediana    = hm;
                nuevo      = null;
            }
            else
            {
                bool esta;
                esta = buscarPagina(actual, hm, ref k);
                if (esta)
                {
                    Console.WriteLine("Clave duplicada: " + hm.idAtaque);
                    subeArriba = false;
                    return;
                }
                empujar(actual.ramas[k], hm, ref subeArriba, ref mediana, ref nuevo);
                if (subeArriba)
                {
                    if (actual.paginaLlena(actual))
                    {
                        dividirNodo(actual, mediana, nuevo, k, ref mediana, ref nuevo);
                    }
                    else
                    {
                        subeArriba = false;
                        meterHoja(actual, mediana, nuevo, k);
                    }
                }
            }
        }
예제 #4
0
        public HistorialMov buscarClave(int idMov)
        {
            HistorialMov tmp = null;

            buscarClave(raiz, ref tmp, idMov);
            return(tmp);
        }
예제 #5
0
        public void insertarArbolB(int coordX, int coordY, string idUnidadAtacante, int resultDanio, string idUnidadAtacada, string idEmisor, string idReceptor, string fecha, string tiempo, int idAtaque)
        {
            NodoMatriz cubo = listaJuegos.buscar(idEmisor, idReceptor);

            if (cubo != null)
            {
                HistorialMov nuevo = new HistorialMov(coordX, coordY, idUnidadAtacante, resultDanio, idUnidadAtacada, idEmisor, idReceptor, fecha, tiempo, idAtaque);
                cubo.historial.insertar(nuevo);
            }


            //arbolB.insertar(nuevo);
            //g.generarGrafoArbolB(ref arbolB.raiz);
        }
예제 #6
0
        public void meterHoja(Pagina actual, HistorialMov hm, Pagina rd, int k)
        {
            int i;

            /*desplaza a la derecha los elementos para hcer un hueco*/
            for (i = actual.cuenta; i >= k + 1; i--)
            {
                actual.claves[i + 1] = actual.claves[i];
                actual.ramas[i + 1]  = actual.ramas[i];
            }
            actual.claves[k + 1] = hm;
            actual.ramas[k + 1]  = rd;
            actual.cuenta++;
        }
예제 #7
0
        public void insertar(ref Pagina raiz, HistorialMov hm)
        {
            bool         subeArriba = false;
            HistorialMov mediana    = null;
            Pagina       p          = null;
            Pagina       nd         = null;

            empujar(raiz, hm, ref subeArriba, ref mediana, ref nd);
            if (subeArriba)
            {
                p           = new Pagina(orden);
                p.cuenta    = 1;
                p.claves[1] = mediana;
                p.ramas[0]  = raiz;
                p.ramas[1]  = nd;
                raiz        = p;
            }
        }
예제 #8
0
 public Pagina buscar(Pagina actual, HistorialMov hm, ref int k)
 {
     if (actual == null)
     {
         return(null);
     }
     else
     {
         bool esta = false;
         esta = buscarPagina(actual, hm, ref k);
         if (esta)
         {
             return(actual);
         }
         else
         {
             return(buscar(actual.ramas[k], hm, ref k));
         }
     }
 }
예제 #9
0
        public void dividirNodo(Pagina actual, HistorialMov hm, Pagina rd, int k, ref HistorialMov mediana, ref Pagina nuevo)
        {
            int i, posMdna;

            if (k <= orden / 2)
            {
                posMdna = orden / 2;
            }
            else
            {
                posMdna = orden / 2 + 1;
            }

            nuevo = new Pagina(orden);
            for (i = posMdna + 1; i < orden; i++)
            {
                /* es desplzada la mida derecha al nuevo nodo, la clave mediana se queda en el nodo origen*/
                nuevo.claves[i - posMdna] = actual.claves[i];
                nuevo.ramas[i - posMdna]  = actual.ramas[i];
            }
            nuevo.cuenta  = (orden - 1) - posMdna; /* claves en el nuevo nodo*/
            actual.cuenta = posMdna;               //claves en el nodo origen
            /* es insertada la clave y rama en el nodo que le corresponde*/
            if (k <= orden / 2)
            {
                meterHoja(actual, hm, rd, k);    /* inserta en el nodo origen*/
            }
            else
            {
                meterHoja(nuevo, hm, rd, k - posMdna);
            }
            /* se extrae clave mediana del nodo origen*/
            mediana = actual.claves[actual.cuenta];
            /* Rama0 del nuevo nodo es la rama de la mediana*/
            nuevo.ramas[0] = actual.ramas[actual.cuenta];
            actual.cuenta--; /* disminuye ya que se quieta la mediana*/
        }
예제 #10
0
 public void insertar(HistorialMov hm)
 {
     insertar(ref raiz, hm);
 }