domingo, 3 de fevereiro de 2013

Resolução - Robô colecionador - 2010

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]

2 comentários:

  1. Alisson, bom dia !
    Está faltando alguma coisa no código?

    ResponderExcluir
    Respostas
    1. Olá Rafael, quando eu postei o código rodou de boa, qual problema de compilacao ou de execucao voce está tendo?

      Excluir