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