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) % 4Comando
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;
}#include <iostream>
using namespace std;
int main(){
char comando;
int N, direcao;
char direcoes[4] = {'N', 'L', 'S', 'O'};
while(cin >> N){
if(!N) break;
direcao = 0;
for(int i = 0; i < N; ++i){
cin >> comando;
direcao += (comando == 'D') ? 1 : -1;
direcao = (direcao + 4) % 4;
}
cout << direcoes[direcao] << endl;
}
return 0;
}var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var lines = input.split('\n');
const direcoes = ["N", "L", "S", "O"];
while (lines.length) {
let N = parseInt(lines.shift());
if(!N) break;
let comandos = lines.shift().trim().split("");
let direcao = comandos.reduce((acc, cur) => {
acc += cur === "D" ? 1 : -1;
return (acc + 4) % 4;
}, 0);
console.log(direcoes[direcao]);
}direcoes = ['N', 'L', 'S', 'O']
while True:
try:
N = int(input())
if(N == 0):
break
comandos = input()
direcao = 0
for comando in comandos:
direcao += 1 if comando == 'D' else -1
direcao = (direcao + 4) % 4
print(direcoes[direcao])
except EOFError:
breakLast updated
Was this helpful?