Questão da maratona de programação de 2010, consiste em elaborar um algoritmo para calcular quantas figurinhas serão coletas pelo robô. O modo mais simples que veio a minha cabeça foi criar uma matriz de char para armazenar todos os elementos da arena e uma struct para armazenar a posição inicial e a próxima posição que ele irá ocupar:
struct pos {
int x;
int y;
int prox_x;
int prox_y;
}pos;
Com isto basta apenas receber a string de comandos, prestar atenção nas bordas, nas colunas, apagar as figurinhas coletadas e criar um contador para armazenar o número de figuras coletadas!
Vamos lá:
#include<stdio.h>
struct pos {
int x;
int y;
int prox_x;
int prox_y;
}pos;
int main (void) {
int L, C, S;
while (scanf("%d %d %d", &L, &C, &S)&&L!=0) {
int i, j, fig=0;
char tab[L][C], cmd[S+1];
getchar();
for(i=0; i<L; i++) {
for(j=0; j<C; j++) {
tab[i][j]=getchar();
if(tab[i][j]!='.'&&tab[i][j]!='*'&&tab[i][j]!='#') {
pos.x=i;
pos.y=j;
switch (tab[i][j]) {
case 'N':
pos.prox_x=i-1;
pos.prox_y=j;
break;
case 'S':
pos.prox_x=i+1;
pos.prox_y=j;
break;
case 'L':
pos.prox_x=i;
pos.prox_y=j+1;
break;
case 'O':
pos.prox_x=i;
pos.prox_y=j-1;
break;
}
}
}
getchar();
}
scanf("%s", cmd);
for (i=0; i<S; i++) {
switch (cmd[i]) {
case 'D':
if (pos.prox_y==pos.y) {
if (pos.prox_x>pos.x) {
pos.prox_x=pos.x;
pos.prox_y=pos.y-1;
}
else {
pos.prox_x=pos.x;
pos.prox_y=pos.y+1;
}
}
else {
if (pos.prox_y>pos.y) {
pos.prox_y=pos.y;
pos.prox_x=pos.x+1;
}
else {
pos.prox_y=pos.y;
pos.prox_x=pos.x-1;
}
}
break;
case 'E':
if (pos.prox_x==pos.x) {
if (pos.prox_y>pos.y) {
pos.prox_y=pos.y;
pos.prox_x=pos.x-1;
}
else {
pos.prox_y=pos.y;
pos.prox_x=pos.x+1;
}
}
else {
if (pos.prox_x>pos.x) {
pos.prox_x=pos.x;
pos.prox_y=pos.y+1;
}
else {
pos.prox_x=pos.x;
pos.prox_y=pos.y-1;
}
}
break;
case 'F':
if (tab[pos.prox_x][pos.prox_y]!='#'&&(pos.prox_x<L&&pos.prox_x>-1)&&(pos.prox_y<C&&pos.prox_y>-1)) {
if (tab[pos.prox_x][pos.prox_y]=='*') {
tab[pos.prox_x][pos.prox_y]='.';
fig++;
}
if (pos.prox_y==pos.y) {
if (pos.prox_x>pos.x) {
pos.x=pos.prox_x;
pos.prox_x++;
}
else {
pos.x=pos.prox_x;
pos.prox_x--;
}
}
else {
if (pos.prox_y>pos.y) {
pos.y=pos.prox_y;
pos.prox_y++;
}
else {
pos.y=pos.prox_y;
pos.prox_y--;
}
}
}
break;
}
}
printf("%d\n", fig);
}
return 0;
}
Admito que o código é bem deselegante mas é uma forma simples e fácil de implementar
SITE: http://www.urionlinejudge.com.br/judge/problems/view/1121
[sourcecode language="c"]
Escreva aqui seu código-fonte.
[/sourcecode]
Alisson, bom dia !
ResponderExcluirEstá faltando alguma coisa no código?
Olá Rafael, quando eu postei o código rodou de boa, qual problema de compilacao ou de execucao voce está tendo?
Excluir