예제 #1
0
        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);
        }
예제 #2
0
        public Stack <String> AcharCaminho(String cidadeInicio, String cidadeDestino, ParametrosDeBusca param)
        {
            Stack <String> percurso = MelhorCaminho(cidadeInicio, cidadeDestino, new List <String>(), param);

            return(percurso);
        }