private void CriaCaminho(NoArvore <Cidade> origem, int procurado) { ListaSimples <Caminho> cam = new ListaSimples <Caminho>(); //Uma lista para armazenar todos os caminhos possíveis Caminho inicial = new Caminho(); //Um caminho inicial apenas para a chamada do método VaiPara(ref cam, inicial, origem, procurado); txtTeste.Text = cam.ToString(); }
private void VaiPara(ref ListaSimples <Caminho> cam, Caminho jaPercorrido, NoArvore <Cidade> origem, int procurado) { //Como salvamos o valor dos caminhos usando da coluna para marcar a cidade de destino, pensamos em criar um método da matriz esparsa para //nos retornar o primeiro membro dessa coluna, desta forma poderíamos ver todas as possibilidades de caminho que levam até a cidade escolhida Celula <CaminhoEntreCidades> atual = caminhos.BuscaColuna(procurado); NoArvore <Cidade> cid = new NoArvore <Cidade>(); //A Cidade que nos levará até lá NoArvore <Cidade> cidadeAtual = new NoArvore <Cidade>(); //A Cidade que queremos ir while (atual.Valor != null) //Percorre-se até que não aja mais nenhum caminho que nos leve a cidade { cidades.Existe(new Cidade(procurado, "", 0, 0), ref cidadeAtual); //Apenas para ajustar o pârametro de referência if (cidades.Existe(new Cidade(atual.Valor.IdCidadeOrigem, "", 0, 0), ref cid)) //Idem { if (atual.Valor.IdCidadeOrigem != origem.Info.IdCidade) //Caso atinjamos a cidade buscada pela cidade de origem podemos encerrar o //método visto que já conseguimos completar o caminho { if (!jaPercorrido.CidadesVisitadas.ExisteDesordenado(cid.Info) && !jaPercorrido.CidadesVisitadas.ExisteDesordenado(cidadeAtual.Info)) //Para não passarmos por cidades repetidamente //E Evitar loops (ir e voltar infinitamente) { Caminho Aux = new Caminho(jaPercorrido); //Como ainda existem outros caminhos para se explorar, não podemos perder o valor //do jaPercorrido Atual que será usado quando este metodo descongelar, então é //melhor que editemos e mandemos apenas um clone Aux.CidadesVisitadas.InserirAntesDoInicio(cidadeAtual.Info); //A Cidade Atual é a cidade por qual devemos passar para chegar //ao destino (ou o próprio destino) Aux.Distancia += atual.Valor.Distancia; Aux.Custo += atual.Valor.Custo; Aux.Tempo += atual.Valor.Tempo; VaiPara(ref cam, Aux, origem, cid.Info.IdCidade); //Chamamos o Método Novamente de Forma Recursiva } } else { Caminho Aux = new Caminho(jaPercorrido); //Como Anteriormente dito, mesmo que o caminho esteja completo, novos caminhos podem //ser explorados, então não podemos perder os valores padrões do jaPercorrido Aux.CidadesVisitadas.InserirAntesDoInicio(cidadeAtual.Info); //Inserimos a primeira cidade visitada Aux.Distancia += atual.Valor.Distancia; Aux.Custo += atual.Valor.Custo; Aux.Tempo += atual.Valor.Tempo; Aux.CidadesVisitadas.InserirAntesDoInicio(origem.Info); // E por fim a Origem cam.InserirEmOrdem(Aux); //Este caminho está completo e deve ser guardado } } else { throw new Exception("Cidade Não Existe"); } atual = atual.Abaixo; //Continuamos a procurar um novo caminho } }