Pesquisar este blog

Livros Recomendados

Mostrando postagens com marcador 1437. Mostrar todas as postagens
Mostrando postagens com marcador 1437. Mostrar todas as postagens

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;
}

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