1437 - Esquerda, Volver!

Mais um problema para testar sua criatividade usando operações matemáticas.

Descrição

Solução

Algo que pode nos ajudar muito a calcular a direção resultante do recruta é mapear cada direção a um número específico. A tabela abaixo mostra o mapeamento que vamos usar, mas você pode usar qualquer um, desde que facilite seu cálculo com os comandos E e D:

Direção

Número

Norte (N)

0

Leste (L)

1

Sul (S)

2

Oeste (O)

3

Desta maneira, cada comando equivale a uma operação no número da direção.

  • Comando D: (numero + 1) % 4

  • Comando E: ((numero - 1) + 4) % 4

Dê uma olhada na página Deslocar dentro de um intervalo [0, N - 1] para entender porque os comandos D e E funcionam. A tabela abaixo mostra o resultado para cada direção após as operações para ter uma prova real de que sempre dá o resultado apropriado.

Direção antes do comando

Número antes do comando

Comando

Número após o comando

Direção após o comando

Norte (N)

0

D

(0 + 1) % 4 = 1

Leste (L)

Norte (N)

0

E

((0 - 1) + 4) % 4 = 3

Oeste (O)

Leste (L)

1

D

(1 + 1) % 4 = 2

Sul (S)

Leste (L)

1

E

((1 - 1) + 4) % 4 = 0

Norte (N)

Sul (S)

2

D

(2 + 1) % 4 = 3

Oeste (O)

Sul (S)

2

E

((2 - 1) + 4) % 4 = 1

Leste (L)

Oeste (O)

3

D

(3 + 1) % 4 = 0

Norte (N)

Oeste (O)

3

E

((3 - 1) + 4) % 4 = 2

Sul (S)

A cada comando, simular a posição que o recruta fica após o mesmo. Por exemplo, se o recruta está virado ao norte e recebe o comando E, o recruta agora está virado para o oeste. Ao final, ver em qual posição ele ficou depois de todos os comandos.

#include <stdio.h>

int main(){
    char comando;
    int N, direcao;
    char direcoes[4] = {'N', 'L', 'S', 'O'};

    while(scanf("%d\n", &N)){
        if(!N)  break;

        direcao = 0;
        for(int i = 0; i < N; ++i){
            scanf("%c", &comando);

            direcao += (comando == 'D') ? 1 : -1;
            direcao = (direcao + 4) % 4;
        }

        printf("%c\n", direcoes[direcao]);
    }

    return 0;
}

Last updated