private void AcharCaminhos(int origem, int destino, int distanciaAcumulada) //origem == idCidadeOrigem || destino == idCidadeDestino { var cidadeOrigem = cidades.Find(c => c.IdCidade == origem); if (origem != destino) // Indica que ainda não chegou no destino { cidadeOrigem.FoiVisitado = true; for (int coluna = 0; coluna < cidades.Count; coluna++) { if (!(matrizDeAdjacencias[origem, coluna] == 0 || cidades.Find(c => c.IdCidade == coluna).FoiVisitado)) // Se há caminho entre as cidades e a segunda ainda não foi visitada { if (caminho.EstaVazia() || caminho.OTopo().IdCidade != origem) { caminho.Empilhar(cidadeOrigem); } AcharCaminhos(coluna, destino, distanciaAcumulada + matrizDeAdjacencias[origem, coluna]); caminho.Desempilhar(); // Desempilha para permitir que outros caminhos sejam encontrados } } } else { caminho.Empilhar(cidades.Find(c => c.IdCidade == destino)); var caminho2 = new PilhaLista <Cidade>(); var aux = new PilhaLista <Cidade>(); while (!caminho.EstaVazia()) // Desempilha o caminho para inverter a pilha { caminho2.Empilhar(caminho.OTopo()); aux.Empilhar(caminho.Desempilhar()); } caminhos.Add(caminho2); // Armazena o caminho encontrado caminho = new PilhaLista <Cidade>(); while (!aux.EstaVazia()) // Retorna as informações que foram colocadas numa pilha auxiliar à variavel "caminho" { caminho.Empilhar(aux.Desempilhar()); } distancias.Add(distanciaAcumulada); // Armazena a distância percorrida no caminho encontrado foreach (Cidade c in cidades) // Desmarca as cidades para permitir que outros caminhos com trechos parecidos sejam encontrados { c.FoiVisitado = false; } } }