Sei sulla pagina 1di 2

Estruturas de Dados

Exercı́cio de Programação I
Menor caminho para sair de um labirinto

Prof. Dr. Silvio do Lago Pereira

slago@ime.usp.br

1 Descrição do problema

Você deve desenvolver um programa para encontrar um menor caminho que


leva da entrada até a saı́da de um labirinto (veja um exemplo de programa no
endereço www.ime.usp.br/~slago/ep1.exe).

1 9 10 11 x
2 8 12 x
3 7 11 x
4 5 6 10 x x x
5 7 8 9 x x x

(a) labirinto (b) passos (c) caminho

Figura 1. Matriz bidimensional representando um labirinto.

O labirinto é representado por uma matriz quadrada L[n, n], onde L[i, j] = 0
indica que a posição (i, j) está livre e L[i, j] = 32767 indica que a posição (i, j)
está obstruı́da por uma parede. Assumimos que a entrada do labirinto está na
posição (2, 2) e que sua saı́da está na posição (n − 1, n − 1), como indicado
na Figura 1-a. Ademais, só são permitidos movimentos entre posições livres e
adjacentes (vertical ou horizontalmente, mas não diagonalmente).
O código-fonte das rotinas para criação e exibição do labirinto, bem como do
programa principal, está disponı́vel em www.ime.usp.br/~slago/ep1.pas. As
demais rotinas, necessárias para a solução do problema, devem ser criadas com
base nos pseudo-códigos apresentados a seguir.
Anotação: Para encontrar um menor caminho, primeiro anotamos na matriz
L o número mı́nimo de passos necessários para atingir cada uma das posições do
labirinto, a partir da entrada. Assim, após a fase de anotação, L[i, j] = k indica
que são necessários k passos para alcançar a posição (i, j), como exemplificado
na Figura 1-b; caso uma posição qualquer da matriz permaneça com valor 0, isso
significa que não existe um caminho que leve da entrada até essa posição.
2 EP1 - Menor caminho para sair de um labirinto

Algoritmo Anotar(L)
L[2, 2] ← 1
insira a posição (2, 2) numa fila vazia F
enquanto a fila F não estiver vazia faça
remova uma posição (i, j) da fila F
para cada posição (x, y) adjacente a (i, j) tal que L[x, y] = 0 faça
L[x, y] ← L[i, j] + 1
insira a posição (x, y) na fila F

Extração: A extração de um menor caminho a partir da matriz anotada, como


exemplificado na Figura 1-c, pode ser feita pelo algoritmo a seguir:

Algoritmo Extrair(L)
se L[n − 1, n − 1] = 0 então não existe saı́da, pare a execução da função
insira a posição (n − 1, n − 1) numa pilha vazia P
enquanto a posição (2, 2) não estiver no topo da pilha P faça
seja (i, j) a posição existente no topo da pilha P
encontre uma posição (x, y) adjacente a (i, j) tal que L[x, y] = L[i, j] − 1
insira a posição (x, y) na pilha P
mostre o caminho armazenado na pilha P

2 Requisitos
– Seu programa deve executar com o compilador Turbo Pascal 5.0.
– Você deve usar o código disponı́vel em www.ime.usp.br/~slago/ep1.pas e
completá-lo com as rotinas que serão implementadas por você.
– Use as bibliotecas disponı́veis em www.ime.usp.br/~slago/pilhas.pas e
www.ime.usp.br/~slago/filas.pas.
– Seu programa deve apresentar uma saı́da semelhante àquela apresentada
pelo programa disponı́vel em www.ime.usp.br/~slago/ep1.exe.
– O trabalho deve ser feito em grupos de 4 alunos, cujos nomes completos
devem constar no código-fonte do programa, sob a forma de comentário.

3 Entrega
– Entregar o código-fonte impresso e enviar uma cópia dele por e-mail:
Para: fatecsp.eped@gmail.com
Assunto: EP1 - NomeAluno1, NomeAluno2, NomeAluno3, NomeAluno4
Arquivo anexado: ep1.pas
– Seu arquivo deve ser anexado com o nome ep1.pas, não use outro nome.
– A cópia impressa e a cópia eletrônica devem ser entregues na mesma data.
– Trabalhos copiados terão a nota dividida pelo número de grupos envolvidos.
– Não serão aceitos trabalhos entregues fora do prazo estabelecido no crono-
grama de aulas divulgado na página da disciplina, disponı́vel no endereço
www.ime.usp.br/~slago.

Potrebbero piacerti anche