Матч
360, Контроль азимута (AzimuthMonitoring)
Дивизион 2,
Уровень 1
Робот расположен в некоторой
точке плоскости и выполняет следующие команды:
"LEFT" – повернуть
налево на 90 градусов;
"RIGHT" – повернуть
направо на 90 градусов;
"TURN AROUND" –
повернуть назад (совершить разворот на 180 градусов)
"LEFT X" – повернуть
налево на X градусов (X – натуральное число);
"RIGHT X" – повернуть
направо на X градусов (X – натуральное число);
"HALT" – остановить
выполнение инструкций; последующие команды не выполнять;
Изначально робот направлен на
север (0 градусов). Вернуть величину азимута, куда будет повернут робот после
выполнения набора инструкций, описанных в массиве instructions. Величина
азимута принимает значения от 0 до 359.
Класс: AzimuthMonitoring
Метод: int
getAzimuth(vector<string> instructions)
Ограничения:
instructions содержит от 1 до 50 элементов, в инструкциях "LEFT X" и
"RIGHT X"
1 £ X £ 179.
Вход. Массив строк instructions, описывающий набор инструкций для робота.
Выход. Величина азимута, куда будет повернут робот после выполнения
набора инструкций instructions. Величина азимута принимает значения от 0 до
359.
Пример входа
instructions |
{"LEFT", "LEFT", "TURN
AROUND"} |
{"RIGHT 59", "RIGHT",
"RIGHT", "HALT", "LEFT", "LEFT",
"LEFT"} |
{"LEFT", "LEFT", "LEFT",
"LEFT", "LEFT", "HALT"} |
Пример выхода
0
239
270
РЕШЕНИЕ
моделирование
Установим начальное направление
робота res = 0. Моделируем работу
робота, последовательно выполняя команды. Для перевода результирующего значения
азимута в интервал [0; 359] добавим к нему большое число, кратное 360 (например
3600000) и возьмем его остаток от деления на 360.
ПРОГРАММА
#include <cstdio>
#include <vector>
#include <string>
using namespace std;
class AzimuthMonitoring
{
public:
int getAzimuth(vector<string> instructions)
{
int n, i, res;
char way[10];
string w;
for(res = n = i = 0; i <
instructions.size(); i++)
{
sscanf(instructions[i].c_str(),"%s
%d",way,&n); w = (string)way;
if (!n) n = 90;
if (w == "LEFT")
res -= n; else
if (w == "RIGHT")
res += n; else
if (w == "TURN")
res += 180; else
if (w == "HALT")
break;
n = 0;
}
return (res + 3600000) % 360;
}
};