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