Nesse post proponho um algoritmo para solucionar uma caça ao tesouro a partir de um mapa. O algoritmo inicia solicitando o mapa e depois avalia se, a partir do mapa especificado, é possível alcançar o tesouro seguindo as instruções.
O mapa aceita os caracteres “>”, “v”, “<“, “^”, “*” e “.”, indicando respectivamente: “ir para a direita”, “ir para baixo”, “ir para a esquerda”, “ir para cima”, “lugar do tesouro” e “caminho sem nada”. O mapa sempre começa na posição 0,0 da matriz.
Solução em C/C++
#include <stdio.h>
#include <string.h>
int main(void) {
int lin, col;
scanf("%i %i\n", &lin, &col);
int mapa[lin][col];
int i, j;
//preenche matriz
for (i = 0; i < lin; i++) {
//fflush(stdin);
for (j = 0; j < col; j++) {
scanf("%c", &mapa[i][j]);
}
}
for (i = 0; i < lin; i++) {
for (j = 0; j < col; j++) {
printf("%c", mapa[i][j]);
}
printf("\n");
}
//percorre o mapa
int posX = 0, posY = 0;
char direcao = '>', leitura;
while (posX < 10) {
leitura = mapa[posY][posX];
if (leitura == '>') {
direcao = '>';
posX = posX + 1;
} else if (leitura == '<') {
direcao = '<';
posX = posX - 1;
} else if (leitura == '^') {
direcao = '^';
posY = posY - 1;
} else if (leitura == 'v') {
direcao = 'v';
posY = posY + 1;
} else if (leitura == '*') {
printf("Achou o tesouro!");
break;
} else { //nao ouve mudanca de direcao
if (direcao == '>') { posX = posX + 1; }
if (direcao == '<') { posX = posX - 1; }
if (direcao == '^') { posY = posY - 1; }
if (direcao == 'v') { posY = posY + 1; }
}
printf("X e Y: %i %i |%c|%c|\n", posX, posY, leitura, direcao);
}
return 0;
}
Teste o código: http://ideone.com/FBj1Ac
Solução em Python
tamX = 3
tamY = 6
mapa = [['>','.','.','v','.','.'],
['.','.','.','.','.','.'],
['.','.','.','>','.','*']]
for i in range(tamX):
for j in range(tamY):
print mapa[i][j],
print
posX = 0
posY = 0
direcao = '>'
while (True):
if mapa[posY][posX] == '>':
direcao = '>'
posX = posX + 1
elif mapa[posY][posX] == '<':
direcao = '<'
posX = posX - 1
elif mapa[posY][posX] == '^':
direcao = '^'
posY = posY - 1
elif mapa[posY][posX] == 'v':
direcao = 'v'
posY = posY + 1
elif mapa[posY][posX] == '*':
print "Achou o tesouro!"
break
else:
if direcao == '>':
posX = posX + 1
if direcao == '<':
posX = posX - 1
if direcao == '^':
posY = posY + 1
if direcao == 'v':
posY = posY + 1
print 'X e Y: ', posX, ' ', posY
Teste o código: http://www.codeskulptor.org/#user42_PXFlhtIcec_0.py