예제 #1
0
    public static bool buscaOrientada(Passo inicio, Passo fim, int largura, bool recuar = false)
    {
        Queue <Passo> grafoBusca = new Queue <Passo>();
        Queue <Passo> visitados  = new Queue <Passo>();

        grafoBusca.Clear();

        grafoBusca.Enqueue(inicio);

        while (grafoBusca.Count > 0)
        {
            Passo         atual   = grafoBusca.Dequeue();
            Queue <Passo> retorno = getSucessores(atual, largura, false);

            while (retorno.Count > 0)
            {
                Passo novo = retorno.Dequeue();

                if ((novo.Equals(fim) && !recuar) || (!novo.Equals(fim) && recuar))
                {
                    return(true);
                }

                if (!visitados.Contains(novo))
                {
                    visitados.Enqueue(novo);
                    grafoBusca.Enqueue(novo);
                }
            }
        }
        return(false);
    }
예제 #2
0
    public Passo busca()
    {
        FilaDePrioridades <Passo> grafoBusca = new FilaDePrioridades <Passo>();
        Dictionary <Passo, int>   visitados  = new Dictionary <Passo, int>();

        grafoBusca.limpa();

        Passo inicio = new Passo((int)posIni.x, (int)posIni.y, 0, null);
        Passo fim    = new Passo((int)posFim.x, (int)posFim.y, 0, null);

        grafoBusca.Add(inicio, 0);

        int nosVisitados = 0;

        while (grafoBusca.contemNos() && nosVisitados < maxBusca)
        {
            nosVisitados++;
            Passo atual = grafoBusca.get();

            if (atual.Equals(fim))
            {
                //Debug.Log("Caminho encontrado, último ponto: " + atual + " / Nós visitados: " + nosVisitados);
                return(atual);
            }

            Queue <Passo> retorno = getSucessores(atual);

            while (retorno.Count > 0)
            {
                Passo novo      = retorno.Dequeue();
                int   pesoTotal = novo.peso + Heuristica(novo, fim);

                if (!visitados.ContainsKey(novo))
                {
                    visitados[novo] = pesoTotal;
                    grafoBusca.Add(novo, pesoTotal);
                }
                else
                {
                    if (visitados[novo] > pesoTotal)
                    {
                        visitados[novo] = pesoTotal;
                        grafoBusca.Add(novo, pesoTotal);
                    }
                }
            }
        }

        Debug.Log("Não há uma rota para a posição: " + fim + " / Nós visitados: " + nosVisitados);
        return(null);
    }