Algorithm


Problem Name: beecrowd | 3053

Problem Link: https://www.beecrowd.com.br/judge/en/problems/view/3053

Jogo Dos Copos

 

Por BR Brazil

Timelimit: 1

Uma brincadeira muito comum e divertida entre dois jogadores usa uma moeda e três copos opacos (ou seja, não é possível ver o que está dentro do copo olhando pela lateral do copo). Os três copos são colocados com a boca para baixo, em uma linha, um ao lado do outro, em posições que vamos chamar de A, B e C. Uma moeda é colocada embaixo de um dos copos. Na brincadeira, um jogador chamado banca realiza um movimento para trocar a posição de dois copos, arrastando os copos de tal modo que se a moeda está em baixo de um dos copos envolvidos no movimento, ela continua embaixo do mesmo copo após a troca de posição. O jogador banca pode realizar três tipos de movimento, ilustrados na figura abaixo:

 

1. Trocar o copo na posição A com o copo na posição B.

 

2. Trocar o copo na posição B com o copo na posição C.

 

3. Trocar o copo na posição A com o copo na posição C.

 

O jogador banca realiza vários movimentos de troca tentando confundir o outro jogador, chamado espectador. Ao final o jogador espectador deve dizer em qual posição está a moeda. Por exemplo, considere que inicialmente a moeda está embaixo do copo na posição A e que o jogador banca realiza uma sequência de apenas três trocas, executando um movimento do tipo 1, após o qual moeda termina embaixo do copo na posição B, seguido de um movimento do tipo 2, após o qual a moeda termina embaixo do copo na posição C, seguido de um movimento do tipo 3, após o qual a moeda termina embaixo do copo na posição A.

 

Nesta tarefa, dadas a descrição da sequência de movimentos e a posição inicial da moeda, você deve escrever um programa que determine a posição final da moeda após todos os movimentos.

Entrada

 

A primeira linha contém um inteiro N, o número de movimentos que o jogador banca realiza. A segunda linha contém um caractere, entre A, B e C, indicando a posição inicial da moeda. Cada uma das N linhas seguintes contém um inteiro, indicando o tipo de movimento efetuado pelo jogador banca na sequência.

 

Saída

 

Seu programa deve produzir uma única linha, com um único caractere entre A, B e C, a posição em que a moeda se encontra ao final da sequência de movimentos.

Restrições • 1 ≤ N ≤ 1000

 

 

 

Exemplos de Entrada Exemplos de Saída

3

A

1

2

3

A

 

 

 

6

C

1

2

3

3

1

1

B

 

Code Examples

#1 Code Example with C Programming

Code - C Programming


#include <stdio.h>

void swap(int* copos, pos1, pos2){
    int aux;
    
    aux = copos[pos1];
    copos[pos1] = copos[pos2];
    copos[pos2] = aux;
}

int main(){
    int n, mov, copos[3] = {0, 0, 0};
    char inicio;
    
    scanf("%d %c", &n, &inicio);

    //O 1 indicará onde a moeda encontra-se. Se o inicio escolhido for A, subtrai A por 65 do código ASCII de 'A'. 
    //E teremos então o número 0, índice do primeiro elemento do vetor.

    copos[inicio - 65] = 1;

    while(n > 0){
        scanf("%d", &mov);
        switch(mov){
            case 1:
                //Caso um destes copos tenha a moeda. Troca a moeda de um copo para outro. Senão, nada mudará. 
                //O comportamento é o mesmo para todos os movimentos. Swap troca o que está em copos[0] pelo que está em copos[1] e vice-versa.
                if(copos[0] || copos[1] == 1)
                    swap(copos, 0, 1);
                break;
            case 2:
                if(copos[1] || copos[2] == 1)
                    swap(copos, 1, 2);
                break;
            case 3:
                if(copos[0] || copos[2] == 1)
                    swap(copos, 0, 2);
                break;
        }

        n--;
    }

    if(copos[0] == 1)
        printf("A\n");
    else
        if(copos[1] == 1)
            printf("B\n");
        else
            printf("C\n");
            
    return 0;
}

Copy The Code & Try With Live Editor

Input

x
+
cmd
3 A 1 2 3

Output

x
+
cmd
A

#2 Code Example with C++ Programming

Code - C++ Programming


#include <iostream>
#include <algorithm>

using namespace std;

int main(){
    int n, mov, copos[3] = {0, 0, 0};
    char inicio;
    
    cin >> n;
    cin >> inicio;

    //O 1 indicará onde a moeda encontra-se. Se o inicio escolhido for A, subtrai A por 65 do código ASCII de 'A'. 
    //E teremos então o número 0, índice do primeiro elemento do vetor.

    copos[inicio - 65] = 1;

    while(n > 0){
        cin >> mov;
        switch(mov){
            case 1:
                //Caso um destes copos tenha a moeda. Troca a moeda de um copo para outro. Senão, nada mudará. 
                //O comportamento é o mesmo para todos os movimentos. Swap troca o que está em copos[0] pelo que está em copos[1] e vice-versa.
                if(copos[0] || copos[1] == 1)
                    swap(copos[0], copos[1]);
                break;
            case 2:
                if(copos[1] || copos[2] == 1)
                swap(copos[1], copos[2]);
                break;
            case 3:
                if(copos[0] || copos[2] == 1)
                swap(copos[0], copos[2]);
                break;
        }

        n--;
    }

    if(copos[0] == 1)
        cout << "A" << endl;
    else
        if(copos[1] == 1)
            cout << "B" << endl;
        else
            cout << "C" << endl;
            
    return 0;
}

Copy The Code & Try With Live Editor

Input

x
+
cmd
3 A 1 2 3

Output

x
+
cmd
A
Advertisements

Demonstration


Previous
#3047 Beecrowd Online Judge Solution 3047 A idade de Dona Mônica Solution in C, C++, Java, Js and Python
Next
#3055 Beecrowd Online Judge Solution 3055 Nota Esquecida Solution in C, C++, Java, Js and Python