Матч 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;

  }

};