Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cassert>
- #include <iostream>
- #include <map>
- #include <string>
- #include <vector>
- #include <sstream>
- using namespace std;
- using namespace std::string_literals;
- enum class QueryType {
- NewBus,
- BusesForStop,
- StopsForBus,
- AllBuses,
- };
- struct Query {
- QueryType type;
- string bus;
- string stop;
- vector<string> stops;
- };
- istream& operator>>(istream& in, Query& q)
- {
- string temp_s1;
- in >> temp_s1;
- //cout << temp_s1;
- if (temp_s1 == "NewBus"s)
- {
- q.type = QueryType::NewBus;
- }
- else if (temp_s1 == "BusesForStop"s)
- {
- q.type = QueryType::BusesForStop;
- in >> q.stop; //в этом случае в переменную структуры будет записано название остановки, для которой надо найти номера автобуса
- return in;
- }
- else if (temp_s1 == "StopsForBus"s)
- {
- q.type = QueryType::StopsForBus;
- in >> q.bus; //в этом случае в переменную структуры будет записан номер остановки, для которой надо найти номера автобуса
- return in;
- }
- else if (temp_s1 == "AllBuses"s)
- {
- q.type = QueryType::AllBuses; //ничего дополнительно не заполняем в структуре Query
- return in;
- }
- else
- {
- return in;
- }
- in >> q.bus; //в этом случае в переменную структуры будет записан номер автобуса (его название)
- int stop_count;
- in >> stop_count;
- string temp_s;
- q.stops.clear();
- for (size_t i = 0; i < stop_count; ++i)
- {
- in >> temp_s;
- q.stops.push_back(temp_s);
- }
- return in;
- }
- struct BusesForStopResponse
- {
- vector<string> buses_for_stop;
- };
- ostream& operator<<(ostream& os, const BusesForStopResponse& r)
- {
- if (r.buses_for_stop.empty())
- {
- os << "No stop";
- return os;
- }
- for (size_t i = 0; i < r.buses_for_stop.size();++i)
- {
- if (i != (r.buses_for_stop.size() - 1))
- os << r.buses_for_stop[i] << " ";
- else
- os << r.buses_for_stop[i];
- }
- return os;
- }
- struct StopsForBusResponse
- {
- vector<string> stops_for_bus;
- };
- ostream& operator<<(ostream& os, const StopsForBusResponse& r)
- {
- if (r.stops_for_bus.empty())
- {
- os << "No bus";
- return os;
- }
- for (size_t i = 0; i < r.stops_for_bus.size();++i)
- {
- if (i != (r.stops_for_bus.size() - 1))
- os << r.stops_for_bus[i] << endl;
- else
- os << r.stops_for_bus[i];
- }
- return os;
- }
- struct AllBusesResponse {
- vector<string> all_buses;
- };
- ostream& operator<<(ostream& os, const AllBusesResponse& r)
- {
- if (r.all_buses.empty())
- os << "No buses";
- for (size_t i = 0; i < r.all_buses.size();++i)
- {
- if (i != (r.all_buses.size() - 1))
- os << r.all_buses[i] << endl;
- else
- os << r.all_buses[i];
- }
- return os;
- }
- class BusManager {
- private:
- map<string, vector<string>> buses_to_stops_, stops_to_buses_;
- public:
- void AddBus(const string& bus, const vector<string>& stops)
- {
- auto& ref = buses_to_stops_[bus];
- for (const auto& stop : stops)
- {
- ref.push_back(stop);
- stops_to_buses_[stop].push_back(bus);
- }
- }
- BusesForStopResponse GetBusesForStop(const string& stop) const
- {
- BusesForStopResponse temp_res;
- if (stops_to_buses_.count(stop) == 0)
- return temp_res;
- for (const auto& bus : stops_to_buses_.at(stop))
- temp_res.buses_for_stop.push_back(bus);
- return temp_res;
- }
- StopsForBusResponse GetStopsForBus(const string& bus) const
- {
- StopsForBusResponse temp_res;
- if (buses_to_stops_.count(bus) == 0)
- return temp_res;
- for (const auto& stop : buses_to_stops_.at(bus))
- {
- string temp_str = "Stop "s + stop + ":";
- if (stops_to_buses_.at(stop).size() == 1)
- {
- temp_str += " no interchange"s;
- temp_res.stops_for_bus.push_back(temp_str);
- continue;
- }
- for (const auto& additional_bus : stops_to_buses_.at(stop))
- if (additional_bus != bus)
- temp_str += " "s + additional_bus;
- temp_res.stops_for_bus.push_back(temp_str);
- }
- return temp_res;
- }
- AllBusesResponse GetAllBuses() const
- {
- AllBusesResponse temp_res;
- if (buses_to_stops_.empty())
- return temp_res;
- for (const auto& bus : buses_to_stops_) //можно наверное переделать в цикл for только по первому в паре, чтобы не перебирать во внешнем цикле второе составляющее пары?
- {
- string temp_str;
- for (const auto& stop : buses_to_stops_.at(bus.first))
- temp_str += " "s + stop;
- temp_str = "Bus " + bus.first + ":" + temp_str;
- temp_res.all_buses.push_back(temp_str);
- }
- return temp_res;
- }
- };
- //void TestInput()
- //{
- // BusManager test_bm;
- // Query test_subj;
- //
- // istringstream input;
- // ostringstream output;
- //
- //
- // string test_query1 = "AllBuses"s;
- // input.str(test_query1); //заводим в поток заранее созданную строку, имитируя ввод с клавиатуры
- // input >> test_subj; //вводим в заготовленную переменную данные, которые были введены в поток используя input.str ранее
- // output << test_bm.GetAllBuses(); //делаем вывод заданного типа/формата в наш специально созданный поток
- // cout<< test_bm.GetAllBuses();
- // cout << endl;
- // assert(output.str() == "No buses"); //сверяем то что было выведено с помощью output << test_bm.GetAllBuses(); с контрольным результатом
- //
- //
- // input.str("");
- // input.clear();
- // string test_query2 = "BusesForStop Marushkino"s;
- // input.str(test_query2); //заводим в поток заранее созданную строку, имитируя ввод с клавиатуры
- // input >> test_subj; //вводим в заготовленную переменную данные, которые были введены в поток используя input.str ранее
- // output << test_bm.GetBusesForStop(test_subj.stop); //делаем вывод заданного типа/формата в наш специально созданный поток
- // cout<< test_bm.GetBusesForStop(test_subj.stop);
- // cout << endl;
- // assert(output.str() == "No stop"); //сверяем то что было выведено с помощью output << test_bm.GetBusesForStop(test_subj.stop); с контрольным результатом
- //
- //
- // input.str("");
- // input.clear();
- // string test_query3 = "StopsForBus 32K"s;
- // input.str(test_query3); //заводим в поток заранее созданную строку, имитируя ввод с клавиатуры
- // input >> test_subj; //вводим в заготовленную переменную данные, которые были введены в поток используя input.str ранее
- // output << test_bm.GetStopsForBus(test_subj.bus); //делаем вывод заданного типа/формата в наш специально созданный поток
- // cout<< test_bm.GetStopsForBus(test_subj.bus);
- // assert(output.str() == "No bus"); //сверяем то что было выведено с помощью output << test_bm.GetStopsForBus(test_subj.bus) с контрольным результатом
- //
- //
- // input.str("");
- // input.clear();
- // string test_query4 = "NewBus 32 3 Tolstopaltsevo Marushkino Vnukovo"s;
- // input.str(test_query4); //заводим в поток заранее созданную строку, имитируя ввод с клавиатуры
- // input >> test_subj; //вводим в заготовленную переменную данные, которые были введены в поток используя input.str ранее
- // test_bm.AddBus(test_subj.bus, test_subj.stops); //передаем в тестовый экземпляр класса данные на основе заполненной ранее в input >> test_subj; структуры
- //
- //
- // input.str("");
- // input.clear();
- // string test_query5 = "NewBus 32K 6 Tolstopaltsevo Marushkino Vnukovo Peredelkino Solntsevo Skolkovo"s;
- // input.str(test_query5); //заводим в поток заранее созданную строку, имитируя ввод с клавиатуры
- // input >> test_subj; //вводим в заготовленную переменную данные, которые были введены в поток используя input.str ранее
- // test_bm.AddBus(test_subj.bus, test_subj.stops); //передаем в тестовый экземпляр класса данные на основе заполненной ранее в input >> test_subj; структуры
- //
- //
- // input.str("");
- // input.clear();
- // string test_query6 = "BusesForStop Vnukovo"s;
- // input.str(test_query6); //заводим в поток заранее созданную строку, имитируя ввод с клавиатуры
- // input >> test_subj; //вводим в заготовленную переменную данные, которые были введены в поток используя input.str ранее
- // output << test_bm.GetBusesForStop(test_subj.stop); //делаем вывод заданного типа/формата в наш специально созданный поток
- // cout<< test_bm.GetBusesForStop(test_subj.stop);
- // cout << endl;
- // assert(output.str() == "32 32K"); //сверяем то что было выведено с помощью output << test_bm.GetBusesForStop(test_subj.stop) с контрольным результатом
- //
- //
- // input.str("");
- // input.clear();
- // string test_query7 = "NewBus 950 6 Kokoshkino Marushkino Vnukovo Peredelkino Solntsevo Troparyovo"s;
- // input.str(test_query7); //заводим в поток заранее созданную строку, имитируя ввод с клавиатуры
- // input >> test_subj; //вводим в заготовленную переменную данные, которые были введены в поток используя input.str ранее
- // test_bm.AddBus(test_subj.bus, test_subj.stops); //передаем в тестовый экземпляр класса данные на основе заполненной ранее в input >> test_subj; структуры
- //
- //
- // input.str("");
- // input.clear();
- // string test_query8 = "NewBus 272 4 Vnukovo Moskovsky Rumyantsevo Troparyovo"s;
- // input.str(test_query8); //заводим в поток заранее созданную строку, имитируя ввод с клавиатуры
- // input >> test_subj; //вводим в заготовленную переменную данные, которые были введены в поток используя input.str ранее
- // test_bm.AddBus(test_subj.bus, test_subj.stops); //передаем в тестовый экземпляр класса данные на основе заполненной ранее в input >> test_subj; структуры
- //
- //
- // input.str("");
- // input.clear();
- // string test_query9 = "StopsForBus 272"s;
- // input.str(test_query9); //заводим в поток заранее созданную строку, имитируя ввод с клавиатуры
- // input >> test_subj; //вводим в заготовленную переменную данные, которые были введены в поток используя input.str ранее
- // output << test_bm.GetStopsForBus(test_subj.bus); //делаем вывод заданного типа/формата в наш специально созданный поток
- // cout<< test_bm.GetStopsForBus(test_subj.bus);
- //// assert(output.str() == R"(Stop Vnukovo : 32 32K 950
- ////Stop Moskovsky : no interchange
- ////Stop Rumyantsevo : no interchange
- ////Stop Troparyovo : 950
- ////)"); //сверяем то что было выведено с помощью output << test_bm.GetStopsForBus(test_subj.bus) с контрольным результатом
- //
- //
- // input.str("");
- // input.clear();
- // string test_query10 = "AllBuses"s;
- // input.str(test_query10); //заводим в поток заранее созданную строку, имитируя ввод с клавиатуры
- // input >> test_subj; //вводим в заготовленную переменную данные, которые были введены в поток используя input.str ранее
- // output << test_bm.GetAllBuses(); //делаем вывод заданного типа/формата в наш специально созданный поток
- // cout << test_bm.GetAllBuses();
- //// assert(output.str() == R"(Bus 272: Vnukovo Moskovsky Rumyantsevo Troparyovo
- ////Bus 32 : Tolstopaltsevo Marushkino Vnukovo
- ////Bus 32K : Tolstopaltsevo Marushkino Vnukovo Peredelkino Solntsevo Skolkovo
- ////Bus 950 : Kokoshkino Marushkino Vnukovo Peredelkino Solntsevo Troparyovo
- ////)"); //сверяем то что было выведено с помощью output << test_bm.GetAllBuses(); с контрольным результатом
- //
- //}
- // Реализуйте функции и классы, объявленные выше, чтобы эта функция main
- // решала задачу "Автобусные остановки"
- int main() {
- //TestInput();
- int query_count;
- Query q;
- cin >> query_count;
- BusManager bm;
- for (int i = 0; i < query_count; ++i) {
- cin >> q;
- switch (q.type) {
- case QueryType::NewBus:
- bm.AddBus(q.bus, q.stops);
- break;
- case QueryType::BusesForStop:
- cout << bm.GetBusesForStop(q.stop) << endl;
- break;
- case QueryType::StopsForBus:
- cout << bm.GetStopsForBus(q.bus) << endl;
- break;
- case QueryType::AllBuses:
- cout << bm.GetAllBuses() << endl;
- break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement