public List<Operador> buscarSolucion(Estado estadoInicial) {
        NodoAnchura nodoActual = null;
        Estado estadoActual, estadoSucesor;
        boolean solucion = false;

        abiertos.clear();
        cerrados.clear();
        abiertos.add(new NodoAnchura(estadoInicial, null, null));
        while (!solucion && !abiertos.isEmpty()) {
            nodoActual = abiertos.pollFirst();
            estadoActual = nodoActual.getEstado();
            
            if (estadoActual.esFinal()) {
                solucion = true;
            } else {
                cerrados.put(estadoActual, nodoActual);             

                for (Operador operador : estadoActual.operadoresAplicables()) {
                    estadoSucesor = estadoActual.aplicarOperador(operador);
                    if (!cerrados.containsKey(estadoSucesor) && !estadoEnAbiertos(estadoSucesor)) {
                        // Anadir al principio (COLA -> nodos ordenados de mayor a menor profundidad)
                        abiertos.addFirst(new NodoAnchura(estadoSucesor, nodoActual, operador));
                    }
                }
            }
        }
        
        if (solucion) {
            List<Operador> lista = new LinkedList<Operador>();
            NodoAnchura nodo = nodoActual;

            while (nodo.getPadre() != null) { // Asciende hasta raíz
                lista.add(0, nodo.getOperador()); // Añadir al  principio de la lista de movimientos (vamos de abajo a arriba)
                nodo = (NodoAnchura) nodo.getPadre();
            }
            return (lista);
        } else {
            return ((List<Operador>) null);
        }
    }