Пример #1
0
        /**
         * Método recursivo que retorna todos os caminhos entre as cidades que possuem o Id equivalentes aos parâmetros.
         * Cada passo do caminho em questão é armazenado na pilhaDeMovimentos de movimentos "pilhaMovimento".
         * Por fim, se chegou ao destino, a pilhaDeMovimentos é armazenada na variável "caminhosEncontrados", representando um dos caminhos possíveis
         * O método acaba quando todos os caminhos possíveis são percorridos.
         */
        public List <Caminho> BuscarCaminhos(int idCidadeOrigem, int idCidadeDestino)
        {
            for (int i = 0; i < QtdCidades; i++)
            {
                if ((MatrizAdjacencia[idCidadeOrigem, i] != null) && (!jaPassou[i]))
                {
                    pilhaMovimento.Empilhar(new Movimento(idCidadeOrigem, i));
                    jaPassou[i] = true;

                    if (i == idCidadeDestino) // se chegou ao destino
                    {
                        Caminho novoCaminho = new Caminho();
                        novoCaminho.Movimentos = pilhaMovimento.Clone();
                        caminhosEncontrados.Add(novoCaminho);
                        pilhaMovimento.Desempilhar(); // busca novos caminhos
                        jaPassou[i] = false;
                    }
                    else
                    {
                        BuscarCaminhos(i, idCidadeDestino); // backtracking
                    }
                }
            }

            if (!pilhaMovimento.EstaVazia)
            {
                pilhaMovimento.Desempilhar();
                jaPassou[idCidadeOrigem] = false;
            }
            return(caminhosEncontrados);
        }
 public Caminho(PilhaLista <Movimento> movimentos)
 {
     this.movimentos = movimentos.Clone();
 }
Пример #3
0
        public List <Caminho> BuscarCaminhos(int idCidadeOrigem, int idCidadeDestino)
        {
            int  idCidadeAtual, idSaidaAtual;
            bool achouCaminho = false, naoTemSaida = false;

            bool[] jaPassou = new bool[QtdCidades];

            for (int indice = 0; indice < QtdCidades; indice++)
            {
                jaPassou[indice] = false;
            }

            idCidadeAtual = idCidadeOrigem;
            idSaidaAtual  = 0;
            while (!naoTemSaida)
            {
                naoTemSaida = (idCidadeAtual == idCidadeOrigem && idSaidaAtual == QtdCidades && pilhaAuxiliar.EstaVazia);
                if (!naoTemSaida)
                {
                    while ((idSaidaAtual < QtdCidades) && !achouCaminho)
                    {
                        if (MatrizAdjacencia[idCidadeAtual, idSaidaAtual] == null)
                        {
                            idSaidaAtual++;
                        }

                        else if (jaPassou[idSaidaAtual])
                        {
                            idSaidaAtual++;
                        }

                        else if (idSaidaAtual == idCidadeDestino)
                        {
                            Movimento movimento = new Movimento(idCidadeAtual, idSaidaAtual);
                            pilhaAuxiliar.Empilhar(movimento);
                            achouCaminho = true;
                        }
                        else
                        {
                            Movimento movimento = new Movimento(idCidadeAtual, idSaidaAtual);
                            pilhaAuxiliar.Empilhar(movimento);
                            jaPassou[idCidadeAtual] = true;
                            idCidadeAtual           = idSaidaAtual;
                            idSaidaAtual            = 0;
                        }
                    }
                }
                if (!achouCaminho)
                {
                    if (!pilhaAuxiliar.EstaVazia)
                    {
                        jaPassou[idCidadeAtual] = false;
                        Movimento ultimoMovimento = pilhaAuxiliar.Desempilhar();
                        idSaidaAtual  = ultimoMovimento.IdCidadeDestino;
                        idCidadeAtual = ultimoMovimento.IdCidadeOrigem;
                        idSaidaAtual++;
                    }
                }
                if (achouCaminho)
                {
                    Caminho novoCaminho = new Caminho();
                    novoCaminho.Movimentos = pilhaAuxiliar.Clone();
                    caminhosEncontrados.Add(novoCaminho);
                    achouCaminho = false;
                    pilhaAuxiliar.Desempilhar();

                    for (int i = 0; i < QtdCidades; i++)
                    {
                        jaPassou[i] = false;
                    }

                    idSaidaAtual++;
                }
            }
            return(caminhosEncontrados);
        }