private void Resetar() //metodo que reseta as pilhas e variáveis { dgvCaminhosEncontrados.Rows.Clear(); dgvCaminhosEncontrados.Columns.Clear(); dgvMelhorCaminho.Rows.Clear(); dgvMelhorCaminho.Columns.Clear(); descartados.Clear(); pontesJaUsadas.Clear(); caminhosAchados = 0; for (int i = 0; i < tamanhoArray; i++) { for (int j = 0; j < tamanhoArray; j++) { matrizCaminhosAchados[i, j] = 0; } } pbMapa.Refresh(); pilhaMenorCaminho = null; pnlArvore.Invalidate(); menorDistancia = int.MaxValue; atualDistancia = 0; }
private void BuscarMenorCaminho(PilhaVetor <CaminhoMarte> pilha) //metodo que valida se o caminho é o menor { PilhaVetor <CaminhoMarte> ret = pilha.Copia(); for (int i = 0; !pilha.EstaVazia(); i++) { CaminhoMarte aux = pilha.Desempilhar(); atualDistancia += matrizCaminhos[aux.IdCidadeOrigem, aux.IdCidadeDestino]; //calcula a distancia utilizando a matriz adjacente } if (atualDistancia < menorDistancia) //se o novo caminho tem uma distancia menor que o último, atualiza { menorDistancia = atualDistancia; pilhaMenorCaminho = ret; //guarda o caminho menor } }
// Método Copia, adaptado da correção da prova, utilizado no Projeto no Evento Click do botão Busca, na busca de caminhos, // para armazenar todos os caminhos numa pilha auxiliar que não altere a pilha original ou a afete, // deixando-a intacta para múltiplos usos. public PilhaVetor <Dado> Copia() { PilhaVetor <Dado> retPilha = new PilhaVetor <Dado>(); PilhaVetor <Dado> aux = new PilhaVetor <Dado>(); Dado temp; while (!this.EstaVazia()) { aux.Empilhar(this.Desempilhar()); } while (!aux.EstaVazia()) { temp = aux.Desempilhar(); this.Empilhar(temp); retPilha.Empilhar(temp); } return(retPilha); }
private void BuscarCaminho(int origem) //metodo recursivo para buscar o caminho { for (int dest = 0; dest < 23; dest++) //irá percorrer a matriz adjacente para encontrar os destinos que a origem passada como parâmetro tem { if (matrizCaminhos[origem, dest] != 0 && !Contem(dest)) //metodo contém para seber se já passamos por uma cidade que não leva ao destino desejado { while (!pilhaCaminhosPossiveis.EstaVazia() && pilhaCaminhosPossiveis.OTopo().IdCidadeDestino != origem) //enquanto o último destino que eu fui não é onde eu estou (deve ser onde eu estou) { pilhaCaminhosPossiveis.Desempilhar(); //desempilha (descarta esse caminho) } pilhaCaminhosPossiveis.Empilhar(new CaminhoMarte(origem, dest, matrizCaminhos[origem, dest])); //se eu avanço, empilho um novo caminho if (dest == idDestino && !PonteJaUsada(origem)) //chego no meu destino { caminhosAchados++; BuscarMenorCaminho(pilhaCaminhosPossiveis.Copia()); // busca menor caminho //pilha temporaria para poder desempilha-la PilhaVetor <CaminhoMarte> temp = pilhaCaminhosPossiveis.Copia().Inverte(); //para escrever no gridview dos camnhos inverte para facilitar //escreve em uma matriz os caminhos achados para facilitar na inserção do gridview posteriormente matrizCaminhosAchados[caminhosAchados, 1] = idOrigem; int i = 2; while (!temp.EstaVazia()) { matrizCaminhosAchados[caminhosAchados, i] = temp.Desempilhar().IdCidadeDestino; // começa no [1,1] i++; } pontesJaUsadas.Add(pilhaCaminhosPossiveis.OTopo().IdCidadeOrigem); } else { BuscarCaminho(dest); } } } }
private void AdicionarNoGridView() //metodo que percorre a matriz dos caminhos e passa para o gridview { int tamanhoColunas = 0; int tamanhoLinhas = 0; if (idOrigem == 0) // caso o origem fosse 0, ele nao aumentaria nas colunas abaixo { tamanhoColunas++; } //calcula quantas colunas e linhas terão for (int i = 1; i < tamanhoArray; i++) { for (int j = 1; j < tamanhoArray; j++) { if (matrizCaminhosAchados[i, j] != 0) { if (tamanhoColunas < j) { tamanhoColunas++; } if (tamanhoLinhas < i) { tamanhoLinhas++; } } } } if (tamanhoLinhas == 0) //se não existe dados no gridview é porque rotas não foram encontradas { MessageBox.Show("Não existem caminhos entre esses destinos"); Resetar(); return; } List <CidadeMarte> listaCidades = arvoreCidades.ParaLista(); //escreve os dados no gridview dgvCaminhosEncontrados.RowCount = tamanhoLinhas; dgvCaminhosEncontrados.ColumnCount = tamanhoColunas; for (int lin = 0; lin < tamanhoLinhas; lin++) { for (int col = 0; col < tamanhoColunas; col++) { dgvCaminhosEncontrados.Rows[lin].Cells[col].Value = matrizCaminhosAchados[lin + 1, col + 1] + " - " + listaCidades.ElementAt(matrizCaminhosAchados[lin + 1, col + 1]).Nome; } } int copiaTamanhoColunas = tamanhoColunas; for (int lin = 1; tamanhoColunas > 1 && lin <= tamanhoLinhas; lin++) { while (matrizCaminhosAchados[lin, tamanhoColunas] == 0) { dgvCaminhosEncontrados.Rows[lin - 1].Cells[tamanhoColunas - 1].Value = ""; tamanhoColunas--; } tamanhoColunas = copiaTamanhoColunas; } dgvMelhorCaminho.ColumnCount = pilhaMenorCaminho.Tamanho() + 1; dgvMelhorCaminho.RowCount = 1; PilhaVetor <CaminhoMarte> pilhaParaMostrar = pilhaMenorCaminho.Copia().Inverte(); dgvMelhorCaminho.Rows[0].Cells[0].Value = idOrigem + " - " + listaCidades.ElementAt(idOrigem).Nome; for (int i = 1; !pilhaParaMostrar.EstaVazia(); i++) { dgvMelhorCaminho.Rows[0].Cells[i].Value = pilhaParaMostrar.OTopo().IdCidadeDestino + " - " + listaCidades.ElementAt(pilhaParaMostrar.Desempilhar().IdCidadeDestino).Nome; } }