Você está na página 1de 4

PROBLEMAS DE BUSCA

ELEVTRBL – PROBLEMA NO ELEVADOR

Você está no caminho da sua primeira entrevista de emprego como testador de


programa e já está atrasado. A entrevista é em um prédio (arranha-céu) e você
está no piso s, onde vê um elevador. Ao entrar no elevador, você aprende que
ele possui apenas dois botões, marcados com “UP u” e “DOWN d”. Você conclui
que o botão u sobe o elevador para u andares (se não houver pisos suficientes,
pressionar o botão UP não faz nada, ou pelo menos é o que você supõe),
enquanto o botão DOWN leva você para baixo (ou nenhum se não houver o
suficiente). Sabendo que a entrevista está no andar g, e que existem apenas f
andares no prédio, você decide rapidamente escrever um programa que ofereça
a quantidade de pressionamentos de botão que você precisa executar. Se você
simplesmente não consegue alcançar o piso correto, seu programa para com a
mensagem “use as escadas”.

Entrada:

A entrada consistirá em uma linha, ou seja, f s g u d, onde 1 <= s, g <= f <=


1000000 e 0 <= u, d <= 1000000. Os pisos são indexados por um, ou seja, se
houver 10 andares, s e g esteja em [1; 10]

Saída:

Você deve respondes com o número mínimo de apertos que deve fazer para
passar de s para g ou enviar “use as escadas” se for impossível, dada a
configuração do elevador.

Exemplo

Entrada: 10 1 10 2 1

Saída: 6

Entrada: 100 2 1 1 0

Saída: Use as Escadas

Explicação:
Este é um exercício simples de BFS. Mantenha uma fila (uma lista vinculada) de
andares que você pode visitar, remova atual e adicione (se ainda não tiver
visitado) atual u e atual d à sua fila, mantendo o controle de quantas etapas você
usou para chegar lá, ou seja, etapas [atual]. Depois de atingir a meta, você
retorna as etapas [meta]. Se você nunca atingir a meta, use as escadas.

Se desejar, você pode otimizar rapidamente testando se a meta está acima de


você e se u = 0, ou se a meta está abaixo de você e d = 0, mas isso não é
estritamente necessário, devido ao baixo número de etapas necessárias.

Representação de estados

f Total de pisos do prédio


s Piso que se encontra o usuário
g Piso objetivo
u Quantidade de apertos para cima
d Quantidade de apertos para baixo

Estado atual

 Usuário insere os valores das variáveis

Estado objetivo

 Chegar ao piso objetivo com o mínimo e total de apertos no botão do


elevador

Estados inválidos

 Quando o usuário não pode subir e o piso objetivo é maior do que o piso
que você está
 Quando o usuário não pode descer e o piso objetivo é menor do que o
piso que você está.
 Ultrapassar todos os valores de tentativas;

Ações
Receber do usuário as devidas informações, a quantidade de pisos do prédio, o
piso no qual ele se encontra, o piso no qual ele quer chegar e quantidade de
pisos que ele subirá ou descerá ao pressionar o respectivo botão, com isso
aplicando o bfs e o dfs.

Codificação

var f, s, g, u, d

leia(f)

leia(s)

leia(g)

leia(u)

leia(d)

se(s>=1 e g<=f<=1000000 e u>=0 e d<=10000){

se(g==s)

retorna sucesso;

se (u==0 e g>s) ou (d==0 e g<s)

retorna falha

escreva(“use a escadas”);

bfs(f, s, g, u, d){

estado = s;

enfileira(estado);

enquanto(!pilha_vazia()){

estado = desenfileira();

se (g = s)

retorna sucesso;

filhos = expande(estado);
para cada filho em filhos

enfileira (filho);

Retorna fal

Você também pode gostar