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