Esempio n. 1
0
        private Passo[,] gerarMatriz(string nomeArq, int qtdCidades)
        {
            Passo[,] matrizAdjacencias = new Passo[qtdCidades, qtdCidades];
            StreamReader leitorDeCaminhosCidades = new StreamReader(nomeArq);

            while (!leitorDeCaminhosCidades.EndOfStream)
            {
                string linha     = leitorDeCaminhosCidades.ReadLine();
                int    idOrigem  = int.Parse(linha.Substring(0, 3));
                int    idDestino = int.Parse(linha.Substring(3, 3));
                int    distancia = int.Parse(linha.Substring(6, 5));
                int    tempo     = int.Parse(linha.Substring(11, 4));
                int    custo     = int.Parse(linha.Substring(15, 5));


                Passo c = new Passo(arvoreCidades.BuscarDado(new Cidade(idOrigem)), arvoreCidades.BuscarDado(new Cidade(idDestino)), distancia, tempo, custo);
                matrizAdjacencias[idOrigem, idDestino] = c;
            }

            return(matrizAdjacencias);
        }
Esempio n. 2
0
        /**
         * Método que encontra os caminhos recursivamente e os salva na lista global
         * É passado um único parâmetro: a cidade atual. A partir dela, procuraremos outras cidades para mover no grafo
         * Poderia-se passar o vetor jaPassou e a lista de caminhoFeito como parâmetros para a recursão,
         * mas isso ocuparia muita memória. Então os deixamos globais na classe.
         */
        private void encontrarRecursivo(Cidade cidadeAtual)
        {
            for (int j = 0; j < this.matrizDeAdjacencias.GetLength(0); j++)                                 // percorre as possíveis ligações
            {
                Passo caminho = this.matrizDeAdjacencias[cidadeAtual.Id, j];                                // ligação entre cidade atual e cidade do id 'j'
                if (caminho != null && !jaPassou[j])                                                        // se existir a ligação, e se ainda não passamos pela cidade j
                {
                    this.caminhoFeito.Add(caminho);                                                         // adicionamos o movimento da cidadeAtual para cidade J na nossa lista

                    if (j == this.destino.Id)                                                               // se a cidade para que nos movemos for a cidade procurada
                    {
                        caminhosEncontrados.Add(caminhoFeito.Select(item => (Passo)item.Clone()).ToList()); // adicionamos o caminho na lista de caminhos possíveis
                    }
                    else
                    {                                                       // se não for o destino prucurado
                        jaPassou[caminho.Destino.Id] = true;                // marcamos que já passamos pela próxima cidade
                        encontrarRecursivo(caminho.Destino);                // chamamos o método recursivo, para continuar a busca
                        jaPassou[caminho.Destino.Id] = false;               // ao voltar, marcamos o jaPassou da cidade destino como false
                    }
                    caminhoFeito.RemoveAt(caminhoFeito.Count - 1);          // removemos o passo realizado da lista
                                                                            // e continuamos o loop, a fim de achar novos possíveis caminhos
                }
            }
        }