Матч 210, Инструкции по вождению (DrivingDirections)

Дивизион 2, Уровень 2

 

Инструкции по вождению как правило состоят из набора команд: откуда выезжать и куда ехать. Массив directions содержит строки, первая из которых указывает откуда следует выезжать, а каждая следующая говорит о направлении поворота на ближайшем перекрестке. Первая строка начинается с фразы “Start on”, а каждая следующая с “Turn LEFT on” или “Turn RIGHT on”. После этих фраз в строках идет название улицы, состоящее из букв латинского алфавита, цифр, пробелов и дефисов.

 

Класс: DrivingDirections

Метод: vector<string> reverse(vector<string> directions)

Ограничения: первая строка массива directions начинается с “Start on”, все другие строки начинаются с “Turn LEFT on” или “Turn RIGHT on”. Все строки directions[i] содержат до 50 символов. Строки массива directions содержат буквы латинского алфавита, цифры, пробелы и дефисы.

 

Вход. Массив строк directions.

 

Выход. Массив, содержащий инструкции для проезда из конечной улицы в начальную.

 

Пример входа

DrivingDirections

{"Start on Pirate Street",

"Turn LEFT on Viking Avenue",

"Turn RIGHT on Ninja Court"}

{"Start on planet Earth"}

 

Пример выхода

{"Start on Ninja Court",

 "Turn LEFT on Viking Avenue",

 "Turn RIGHT on Pirate Street"}

{"Start on planet Earth"}

 

 

РЕШЕНИЕ

обработка строк

 

Если инструкции состоят из одной команды, то результатом программы будут эти же инструкции. Иначе следует начать движение с конечной улицы, просматривая инструкции с конца к началу. При этом поворот каждый раз следует производить в сторону, противоположную повороту в текущей инструкции. Названия улиц выделяются из строк при помощи метода substr.

 

ПРОГРАММА

 

#include <cstdio>

#include <string>

#include <vector>

using namespace std;

 

class DrivingDirections

{

public:

 

  vector<string> reverse(vector<string> directions)

  {

    vector<string> res;

    int i;

    if(directions.size() == 1) return directions;

    if (directions[directions.size()-1][5] == 'R')

      res.push_back("Start "+directions[directions.size()-1].substr(11));

      else res.push_back("Start "+directions[directions.size()-1].substr(10));

    for(i = directions.size() - 1; i > 0; i--)

    {

      if (directions[i-1][5] == 'R') res.push_back(((directions[i][5] == 'R')

? "Turn LEFT " : "Turn RIGHT ") + directions[i-1].substr(11));

      if (directions[i-1][5] == 'L') res.push_back(((directions[i][5] == 'R')

? "Turn LEFT " : "Turn RIGHT ") + directions[i-1].substr(10));

      if (directions[i-1][0] == 'S') res.push_back(((directions[i][5] == 'R')

? "Turn LEFT " : "Turn RIGHT ") + directions[i-1].substr(6));

    }

    return res;

  }

};