//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"); }
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; } }
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); } } } }