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