private Stack <String> MelhorCaminho(String objetivo, String atual, List <String> visitados, ParametrosDeBusca param) { List <Stack <String> > distanciasFilhos = new List <Stack <String> >(); //Para ele não ficar passando pela mesma cidade de que veio infinitamente visitados.Add(atual); List <String> vizinhas = Vizinhas(atual); foreach (String s in vizinhas) { if (!visitados.Contains(s)) { //Se chegou na cidade que estava procurando, retorna o caminho com a cidade atual if (objetivo == s) { Stack <String> cidade = new Stack <String>(); cidade.Push(objetivo); cidade.Push(atual); distanciasFilhos.Add(cidade); } //Se ainda não é o objetivo, pergunta para essa cidade vizinha o melhor caminho até o destino Stack <String> caminho = MelhorCaminho(objetivo, s, new List <String>(visitados), param); //Se há algum caminho, coloca esse caminho entre a lista de possíveis caminhos if (caminho != null) { caminho.Push(atual); distanciasFilhos.Add(caminho); } } } //Se não há nenhum caminho até o destino, retorna nulo if (distanciasFilhos.Count == 0) { return(null); } //Coloca o primeiro percurso como o menor Stack <String> menor = distanciasFilhos[0]; float valorMenor; if (param == ParametrosDeBusca.Distancia) { valorMenor = TamanhoPercurso(menor, atual); } else if (param == ParametrosDeBusca.Preco) { valorMenor = PrecoPercurso(menor, atual); } else { valorMenor = TempoPercurso(menor, atual); } //Compara entre os possíveis percursos o menor deles, utilizando como critério o parametro passado foreach (Stack <String> percurso in distanciasFilhos) { float valorTrajeto; if (param == ParametrosDeBusca.Distancia) { valorTrajeto = TamanhoPercurso(percurso, atual); } else if (param == ParametrosDeBusca.Preco) { valorTrajeto = PrecoPercurso(percurso, atual); } else { valorTrajeto = TempoPercurso(percurso, atual); } if (percurso.Count == 0 || valorTrajeto < valorMenor) { menor = percurso; } } return(menor); }
public Stack <String> AcharCaminho(String cidadeInicio, String cidadeDestino, ParametrosDeBusca param) { Stack <String> percurso = MelhorCaminho(cidadeInicio, cidadeDestino, new List <String>(), param); return(percurso); }