Exemplo n.º 1
0
        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;
                }
            }
        }