Pesquisar este blog

Livros Recomendados

domingo, 14 de fevereiro de 2021

URI (BEECROWD) - 1437 - Esquerda, Volver! - Ad-Hoc - C e C++

Exercício "Esquerda, Volver!" resolvido! Esse exercício é da categoria ad-hoc, mas poderia muito bem ser da iniciante pois a solução não é muito complexa. Basicamente exige a criação de condições utilizando o operador % (resto da divisão inteira). Confiram nesse post!

Plataforma: URI (BEECROWD)

Problema1437

Enunciado:

Este ano o sargento está tendo mais trabalho do que de costume para treinar os recrutas. Um deles é muito atrapalhado, e de vez em quando faz tudo errado – por exemplo, ao invés de virar à direita quando comandado, vira à esquerda, causando grande confusão no batalhão. O sargento tem fama de durão e não vai deixar o recruta em paz enquanto este não aprender a executar corretamente os comandos. No sábado à tarde, enquanto todos os outros recrutas estão de folga, ele obrigou o recruta a fazer um treinamento extra. Com o recruta marchando parado no mesmo lugar, o sargento emitiu uma série de comandos "Esquerda, Volver!" e "Direita, Volver!". A cada comando, o recruta deve girar sobre o mesmo ponto e dar um quarto de volta na direção correspondente ao comando. Por exemplo, se o recruta está inicialmente com o rosto voltado para a direção norte, após um comando de "esquerda volver!" ele deve ficar com o rosto voltado para a direção oeste. Se o recruta está inicialmente com o rosto voltado para o leste, após um comando "Direita, volver!" ele deve ter o rosto voltado para o sul. No entanto, durante o treinamento, em que o recruta tinha inicialmente o rosto voltado para o norte, o sargento emitiu uma série tão extensa de comandos, e tão rapidamente, que até ele ficou confuso, e não sabe mais para qual direção o recruta deve ter seu rosto voltado após executar todos os comandos. Você pode ajudar o sargento?


Linguagens: C e C++


Solução:

Basta verificar se o comando é "E" e incrementar a posição, se não for é necessário decrementar. Depois disso basta verificar o resto para cada condição. É importante ressaltar que é necessário verificar se o resto é negativo.

Código em C:

#include <stdio.h>

int main() {
    
    int n, pos;
    char comando;
    while (1) {
        
        scanf("%d ", &n);
        if (n == 0)
            break;
        
        pos = 0;
        while (n--) {
            scanf("%c", &comando);
            
            if (comando == 'E')
                pos++;
            else
                pos--;
        }
        
        if (pos % 4 == 0)
            printf("N\n");
        else if (pos % 4 == 1 || pos % 4 == -3)
            printf("O\n");
        else if (pos % 4 == 3 || pos % 4 == -1)
            printf("L\n");
        else
            printf("S\n");
    }

    return 0;
}

Código em C++:

#include <iostream>
#include <cmath>

using namespace std;

int main() {
    
    int n, pos;
    while (1) {
        
        cin >> n;
        if (n == 0)
            break;
        
        char comando;
        pos = 0;
        while (n--) {
            cin >> comando;
            
            if (comando == 'E')
                pos++;
            else
                pos--;
        }
        
        if (abs(pos % 4) == 0)
            cout << "N";
        else if (pos % 4 == 1 || pos % 4 == -3)
            cout << "O";
        else if (pos % 4 == 3 || pos % 4 == -1)
            cout << "L";
        else
            cout << "S";
        cout << endl;
    }

    return 0;
}

Nenhum comentário:

Postar um comentário

Postagem em destaque

URI (BEECROWD) - 2158 - Helping Uncle Cláudio (Ajudando o Tio Cláudio) - Matemática - C, C++ e Haskell

Buenas! Estou aqui mais uma vez para resolver um problema de Matemática! Agora tenho resolvido alguns dessa categoria, pra que vocês possam ...

Postagens mais visitadas