Esempio n. 1
0
//Este es el recorrido DFS que permite encontrar la solución al juego mediante una búsqueda en profundidad
void dfs(cubo cubos[ncubos],casilla matriz[filas][columnas]){	
	int i,j,k,aux,loop=0,final,contador=0;
	estado *c=NULL,*estado_auxiliar=NULL;
	cubo *auxiliar=NULL;
	push(&c,cubos);			//guarda el primer estado ( raiz ) 
	
	printf("\n\nINICIO DEL JUEGO\n\n");
	while(loop!=8){		//en este paso entra a un bucle que solo se detiene en caso de encontrar solución o que la pila sea vaciada y no haya solución
		
		final=comprobar_estado(cubos,matriz);
		if(final==1){ 
        largo_lista(c);
        printf("\n\nNumero de estados generados : %d\n",contador);
        printf("\n\n");
        system("pause");
        return;
        }
		if(c==NULL){
			printf("\n\nNo hay solucion\n\n");	//si la cola no tiene elementos no hay solución al mapa ingresado
			system("pause");
			return;
		}
			
		auxiliar=(cubo*)malloc(sizeof(cubo)*ncubos);
		
		copiar_cubos(auxiliar,cubos);   // se guarda el vector de cubos del estado padre
	
		printf("\n\nEstado:\n\n");
			
		for(j=0;j<ncubos;j++){
			printf("Cubo %d : x=%d , y=%d\n",j+1,cubos[j].p.x,cubos[j].p.y); // imprime las coordenadas de los cubos en cada estado
		}
		imprime_paso(matriz,cubos); // imprime la representacion de la matriz
		largo_lista(c);
			
		for(i=ncubos-1;i>=0;i--){			//en este for se va generando los hijos de derecha izquierda y se va almacenando en la pila
			k=mover_bloque(i,cubos,matriz);			// de esta manera se podrá seguir la busqueda con el "hijo" más a la izquierda del estado utilizando la funcion pop
			if(k==0) k=empujar(i,cubos,matriz);			
			if(k==1){                           //solo si hay movimiento se guarda el estado
            contador++;
            push(&c,cubos);
            }								
			copiar_cubos(cubos,auxiliar); // se recupera el vector de cubos del estado padre y asi podra generar los otros cubos
		}
		estado_auxiliar=pop(&c); // se obtiene el ultimo elemento de la pila para continuar con la busqueda en profundidad
				
		for(i=0;i<ncubos;i++){
			cubos[i]=estado_auxiliar->cubos[i];		//se actualiza el vector de cubos con los datos del nuevo estado
		}
		printf("\n-----------------------\n");				
	}
Esempio n. 2
0
void insertar(Pagina**raiz, tipoClave cl)
{
   int subeArriba;
   tipoClave mediana;
   Pagina *p,*nd;

   empujar(*raiz, cl, &subeArriba, &mediana, &nd);

   if (subeArriba)
   {
      p = (Pagina*) malloc(sizeof(Pagina));
      p -> cuenta = 1;
      p -> claves[1] = mediana;
      p -> ramas[0] = *raiz;
      p -> ramas[1] = nd;
      *raiz = p;
   }
}
Esempio n. 3
0
void empujar(Pagina* actual, tipoClave cl, int* subeArriba, tipoClave* mediana, Pagina** nuevo)
{
   int k;

   if (actual == NULL)
   {
      *subeArriba = 1;
      *mediana = cl;
      *nuevo = NULL;
   }
   else
   {
      int esta;
      esta = buscarNodo(actual,cl,&k);

      if (esta)
      {
         puts("\nClave duplicada");
         *subeArriba = 0;
         return;
      }

      empujar(actual->ramas[k], cl, subeArriba, mediana, nuevo);

      /* devuelve control; vuelve por el camino de búsqueda */

      if (*subeArriba)
      {
         if (nodoLLeno(actual))
            dividirNodo(actual, *mediana, *nuevo, k, mediana, nuevo);
         else
         {
            *subeArriba = 0;
            meterHoja(actual, *mediana, *nuevo, k);
         }
      }
   }
}