CMP1054 - Estrutura de Dados I
Max Gontijo de Oliveira
2o Trabalho
Aplicação de Filas
1
Resumo
Nesse trabalho, deverão ser desenvolvidos dois programas que utilizem estrutura de la.
2
Detalhes
O trabalho deverá passar por três etapas distintas: entendimento dos problemas a serem abordados, implementação
do programa e execução da implementação.
2.1
Problemas
Dois problemas deverão ser atacados: Busca do menor caminho entre dois vértices em um grafo direcionado e busca
da saída em um labirinto.
2.1.1
Problema 1: Busca do menor caminho entre dois vértices em um grafo direcionado
Em um grafo direcionado as arestas indicam não apenas os vértices envolvidos em uma ligação mas também qual é o
vértice de origem e qual é o vértice de destino. Uma matriz A de dimensões N × N pode ser utilizada para representar
as arestas de um grafo com N vértices. Assim, Aij será igual a 1 caso exista uma aresta que parta do vértice i e vá para
o vértice j ; ou Aij será igual a 0 caso não exista uma aresta que parta do vértice i e vá para o vértice j .
A menor distância entre dois vértices quaisquer é determinada pela quantidade mínima de arestas que devem ser
atravessadas entre o vértice de origem e o vértice de destino.
Crie um programa que, a partir de um dado grafo direcionado, um vértice de origem e outro de destino, encontre e
exiba o menor caminho entre dois vértices.
O programa deverá dar suporte para que o grafo seja informado de duas maneiras possíveis: via entrada informada
pelo usuário, onde seja lida a quantidade de vértices e a existência de cada aresta, uma a uma; e via arquivo de entrada.
No caso de a entrada ser via arquivo, o usuário deverá apenas informar o caminho do arquivo e o programa irá carregar
o grafo. O arquivo de entrada seguirá o seguinte layout :
1
2
3
Quantidade de v é r t i c e s ( i n t )
Quantidade de a r e s t a s ( i n t )
I n í c i o das l i n h a s que l i s t a m as a r e s t a s ( i n t )
Nesse layout, a primeira linha indica quantos vértices terá o grafo. A segunda linha indica a quantidade de arestas.
Essa segunda linha é apenas para facilitar a leitura das arestas (linhas seguintes). Cada aresta será composta de um par
de linhas no arquivo: a primeira linha corresponde ao vértice de origem e a linha seguinte o vértice de destino. E assim
por diante. Assim, se um arquivo tiver valor 4 na primeira linha e valor 5 na segunda linha, o arquivo todo terá 12 linhas,
pois haverão 10 linhas para descrever as arestas (duas para cada aresta).
Observação importante: Nesse arquivo, é considerado o número 0 (zero) como sendo o índice do primeiro vértice.
Veja como seria um EXEMPLO de arquivo de entrada.
1
2
3
4
5
6
7
8
9
10
11
12
4
6
0
1
0
3
1
2
1
3
3
2
Nesse arquivo de exemplo, existem 4 vértices as seguintes arestas: 0 para 1; 0 para 3; 1 para 2; 1 para 3; e 3 para 2.
Isso geraria a seguinte matriz:
Este arquivo de exemplo estará disponível no site do professor.
Independente de o grafo ser lido ou ser carregado via arquivo, as informações de vértice de origem e vértice de destino
serão informadas na sequência.
O programa deverá exibir o menor caminho, caso exista, ou uma mensagem de erro, caso não exista caminho entre os
vértices de origem e de destino.
Deverá ser utilizada a estrutura de lista para construir o algoritmo que encontra o menor caminho.
O aluno é incentivado à criar interfaces grácas ricas, como desenhar os vértices e arestas e permitir que os vértices e
arestas sejam criados com o mouse. Todavia, não é obrigatório.
2.1.2
Problema 2: Labirinto
Considere a existência de um labirinto. Considere que um robô seja colocado em algum lugar desse labirinto. Considere
ainda que esse robô tenha o mapa completo do labirinto. Crie um programa que seja capaz de dar ao robô, o menor
caminho entre sua localização atual e a saída do labirinto.
Seu programa deverá ser capaz de ler um arquivo contendo os dados de entrada. Segue abaixo o layout do arquivo de
entrada.
1
2
3
4
5
Altura do l a b i r i n t o ( i n t )
Largura do l a b i r i n t o ( i n t )
L o c a l i z a ç ã o i n i c i a l do robô − l i n h a ( i n t )
L o c a l i z a ç ã o i n i c i a l do robô − coluna ( i n t )
I n í c i o das l i n h a s que descrevem o mapa do l a b i r i n t o ( char )
Segue um exemplo de arquivo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
11
30
9
1
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗
∗
∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗∗∗∗ ∗
∗ ∗∗
∗∗ ∗ ∗
∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗ ∗ ∗
∗ ∗∗
∗ ∗∗ ∗ ∗
∗ ∗∗ ∗∗∗∗∗ ∗∗∗∗∗∗∗∗ ∗ ∗∗ ∗ ∗
∗ ∗∗ ∗
∗ ∗
∗∗ ∗
∗ ∗
∗ ∗∗ ∗∗∗∗∗ ∗ ∗∗∗∗∗∗ ∗∗∗∗∗∗∗ ∗
∗ ∗∗ ∗
∗
∗
∗∗∗∗@∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
No arquivo, o mapa do labirinto será composto dos caracteres ` ' (espaço), `*' e `@'. Os caracteres ` ' (espaço)
determinam por onde o robô é permitido caminhar; os caracteres `*' determinam paredes intransponíveis pelo robô; e
caractere `@' determina a saída do labirinto.
Este arquivo de exemplo estará disponível no site do professor.
No exemplo acima, o mapa tem 11 linhas e 30 colunas e o robô inicializa na linha 9/coluna 1 (considerando que os
índices começam em 0).
O seu programa deverá imprimir o mapa mostrando o robô na posição inicial por meio de um caractere `R' e utilizar
caracteres `x' para indicar o caminho percorrido. Veja o resultado para o exemplo acima:
1
2
3
4
5
6
7
8
9
10
11
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗ xxxxxxxxxxxxxxxxxxxxxxxxxxx ∗
∗ x ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗∗∗∗ x ∗
∗ x ∗∗
∗∗ ∗ x ∗
∗ x ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗∗ ∗ x ∗
∗ x ∗∗ xxxxxxxxxxxxxxxx ∗ ∗∗ ∗ x ∗
∗ x ∗∗ x ∗∗∗∗∗ ∗∗∗∗∗∗∗∗ x ∗ ∗∗ ∗ x ∗
∗ x ∗∗ x ∗
∗ ∗
∗∗ x ∗
∗x ∗
∗ x ∗∗ x ∗∗∗∗∗ ∗ ∗∗∗∗∗∗ x ∗∗∗∗∗∗∗ x ∗
∗R∗∗ x ∗
∗
xxxxxxxxxx ∗
∗∗∗∗@∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
Caso não exista saída do labirinto, seu programa deverá escrever essa informação na tela.
Deverá ser utilizada a estrutura de lista para construir o algoritmo que encontra o menor caminho para a saída do
labirinto.
O aluno é incentivado à criar interfaces grácas ricas, como desenhar o labirinto e o caminho em uma janela. Todavia,
não é obrigatório.
2.2
Implementação
Todos os programas deverão ser escritos em C++, preferencialmente (mas não obrigatório) compiláveis e executáveis
em ambiente Linux.
É permitido (e incentivado) o uso de interfaces grácas ricas no desenvolvimento dos programas. Apenas como
referência, seguem SUGESTÕES de como poderiam car as interfaces grácas dos programas:
Figura 1: Menor caminho entre dois vértices em um grafo direcionado
Figura 2: Labirinto
2.2.1
Dica de implementação: Menor caminho em grafo
Para realizar a leitura do arquivo de entrada, você pode utilizar a classe ifstream. Para isso, você precisa de:
1. Importar a biblioteca necessária: #include <fstream>
2. Abrir o arquivo: ifstream entrada("arquivo_grafo.txt");
3. Obtenha a quantidade de vértices e armazene-a em um inteiro: entrada qtde_vertices;
4. Obtenha a quantidade de arestas e armazene-a em um inteiro: entrada qtde_arestas;
5. Obtenha as demais linhas do arquivo que representam o labirinto, uma a uma:
• entrada origem;
• entrada destino;
• matriz[origem][destino] = 1;
6. Não se esqueça de fechar o arquivo: entrada.close();
2.2.2
Dica de implementação: Labirinto
Para realizar a leitura do arquivo de entrada, você pode utilizar a classe ifstream. Para isso, você precisa de:
1. Importar a biblioteca necessária: #include <fstream>
2. Abrir o arquivo: ifstream entrada("arquivo_labirinto.txt");
3. Obtenha a quantidade de linhas e armazene-a em um inteiro: entrada lins;
4. Obtenha a quantidade de colunas e armazene-a em um inteiro: entrada cols;
5. Obtenha a posição inicial do robô (linha) armazene-a em um inteiro: entrada i_robo;
6. Obtenha a posição inicial do robô (coluna) armazene-a em um inteiro: entrada j_robo;
7. Como a última leitura foi de um valor inteiro e as próximas serão de strings, então limpe o buer do teclado:
entrada.ignore();
8. Obtenha as demais linhas do arquivo que representam o labirinto, uma a uma: getline(entrada, linha);
9. Não se esqueça de fechar o arquivo: entrada.close();
2.3
Execução
Será necessário executar o programa em horário de aula para que o professor possa avaliar a implementação dos
requisitos mencionados neste documento bem como sugerir melhorias até a data da entrega.
3
Entrega
O trabalho deverá ser entregue em duas etapas: a primeira é a entrega dos arquivos de código fonte via e-mail para o
endereço [email protected] com o seguinte assunto:
[CMP1054] Trabalho 2 - Aplicação de filas
A segunda é a apresentação do trabalho em sala de aula diretamente para o professor.
3.1
Código fonte
Os arquivos de código fonte deverão ser compactados em um único arquivo (ZIP, RAR, 7Z, etc.) e enviados até o dia
às 20:25 (não deverão ser realizadas implementações no dia da apresentação).
06/10/2014
3.2
Apresentação
Todos os alunos deverão apresentar o trabalho ao professor em sala de aula no dia 06/10/2014. Nenhum trabalho
deverá ser nalizado no dia/hora da aula.
A ordem de apresentação será denida por sorteio no mesmo dia. A medida em que o aluno for sorteado e realizar a
apresentação, ele já estará dispensado da aula.
Caso não haja tempo para todas as apresentações no dia, as apresentações continuarão na aula seguinte.
A apresentação será realizada individualmente e irá considerar a capacidade do aluno de explicar todo o código
desenvolvido ou partes especícas determinadas pelo professor. Além disso, poderão ser solicitadas alterações no dia da
apresentação.
4
Avaliação
A avaliação será realizada em duas etapas: uma referente à entrega do programa; a outra referente à apresentação.
A entrega vai considerar o respeito ao prazo, o funcionamento do programa no dia da apresentação e, principalmente,
o uso correto de las.
A apresentação vai considerar a explicação do aluno acerca do código desenvolvido e a capacidade de o aluno responder
perguntas sobre o código ou sobre os problemas atacados. O professor poderá ainda solicitar alterações no código que o
aluno deverá ser capaz de realizar.
Bônus: será concedido na nota do trabalho 0,5 pontos adicionais para cada um dos programas que forem construídos
utilizando alguma interface rica (QT, GTK, OpenGL, etc.) e que estejam funcionando.
Download

Trabalho 2 - Aplicação de Filas