示例#1
0
        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;
        }
示例#2
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
            }
        }
示例#3
0
    // 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);
    }
示例#4
0
        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);
                    }
                }
            }
        }
示例#5
0
        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;
            }
        }