Форум программистов, компьютерный форум, киберфорум
acmades
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

С++ «Неделя вторая - Контейнер map - Автобусные остановки» #13

Запись от acmades размещена 25.07.2017 в 19:07
Показов 43630 Комментарии 2

Продолжаю проходить курс: «Основы разработки на C++: белый пояс»
Задача:
Реализуйте систему хранения автобусных маршрутов. Вам нужно обрабатывать следующие запросы:

NEW_BUS bus stop_count stop1 stop2 ... — добавить маршрут автобуса с названием bus и stop_count остановками с названиями stop1, stop2, ...
BUSES_FOR_STOP stop — вывести названия всех маршрутов автобуса, проходящих через остановку stop.
STOPS_FOR_BUS bus — вывести названия всех остановок маршрута bus со списком автобусов, на которые можно пересесть на каждой из остановок.
ALL_BUSES — вывести список всех маршрутов с остановками.

Формат ввода
В первой строке ввода содержится количество запросов Q, затем в Q строках следуют описания запросов.
Гарантируется, что все названия маршрутов и остановок состоят лишь из латинских букв, цифр и знаков подчёркивания.
Для каждого запроса NEW_BUS bus stop_count stop1 stop2 ... гарантируется, что маршрут bus отсутствует, количество остановок больше 0, а после числа stop_count следует именно такое количество названий остановок, причём все названия в каждом списке различны.

Формат вывода
Для каждого запроса, кроме NEW_BUS, выведите соответствующий ответ на него:
На запрос BUSES_FOR_STOP stop выведите через пробел список автобусов, проезжающих через эту остановку, в том порядке, в котором они создавались командами NEW_BUS. Если остановка stop не существует, выведите No stop.
На запрос STOPS_FOR_BUS bus выведите описания остановок маршрута bus в отдельных строках в том порядке, в котором они были заданы в соответствующей команде NEW_BUS. Описание каждой остановки stop должно иметь вид Stop stop: bus1 bus2 ..., где bus1 bus2 ... — список автобусов, проезжающих через остановку stop, в порядке, в котором они создавались командами NEW_BUS, за исключением исходного маршрута bus. Если через остановку stop не проезжает ни один автобус, кроме bus, вместо списка автобусов для неё выведите no interchange. Если маршрут bus не существует, выведите No bus.
На запрос ALL_BUSES выведите описания всех автобусов в алфавитном порядке. Описание каждого маршрута bus должно иметь вид Bus bus: stop1 stop2 ..., где stop1 stop2 ... — список остановок автобуса bus в порядке, в котором они были заданы в соответствующей команде NEW_BUS. Если автобусы отсутствуют, выведите No buses.

Пример

Ввод
10
ALL_BUSES
BUSES_FOR_STOP Marushkino
STOPS_FOR_BUS 32K
NEW_BUS 32 3 Tolstopaltsevo Marushkino Vnukovo
NEW_BUS 32K 6 Tolstopaltsevo Marushkino Vnukovo Peredelkino Solntsevo Skolkovo
BUSES_FOR_STOP Vnukovo
NEW_BUS 950 6 Kokoshkino Marushkino Vnukovo Peredelkino Solntsevo Troparyovo
NEW_BUS 272 4 Vnukovo Moskovsky Rumyantsevo Troparyovo
STOPS_FOR_BUS 272
ALL_BUSES

Вывод
No buses
No stop
No bus
32 32K
Stop Vnukovo: 32 32K 950
Stop Moskovsky: no interchange
Stop Rumyantsevo: no interchange
Stop Troparyovo: 950
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
Моё решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
 
void All_buses(const map<string, vector<string>>& f) { //вывод всех маршрутов
    if (f.size() == 0) cout << "No buses" << endl; //если размер контейнера = 0, то напишем что ничего нет
    else { //если что-то есть
        for (const auto& i : f) { //пролистаем контейнер и напишем, для каждой пары "ключ-значение"
            cout << "Bus " << i.first << ":"; //название маршрута
            for (const auto& d : i.second) { //а также перечислим 
                cout << " " << d; // название остановок
            }
            cout << endl;
        }
    }
}
void BusforStop(const string& s, const map<string, vector<string>>& f, const vector<string>& busm) { //вывод названий марштутов для остановки
    int k = 0; //определитель наличия чего-нибудь
    vector<string> v;
    for (const auto& i : f) { //листаем контейнер
        for (const auto& n : i.second) { //и в каждом массиве значений для каждого ключа
            if (n == s) { //ищем совпадение с остановкой и, если нашли, 
                v.push_back(i.first); //запишем "найденный" маршрут в вектор
                k++; //плюсанули наличие совпадения
            }
        }
    }
    if (k > 0) { //если есть совпадения
        for (const auto& w : busm) { //пролистаем общий вектор с маршрутами и для каждого маршрута
            for (auto z : v) { //будем просматривать вектор "найденных" маршрутов 
                if (z == w) { //и при совпадении
                    cout << w << " "; //выводим маршрут
                } //таким образом у нас будут выведены маршруты в порядке записи командой NEW_BUS
            }
        }
    }
    else if (k == 0) cout << "No stop"; //если не нашли совпадение, то так и напишем
    cout << endl;
}
void Stopforbus(const string& s, const map<string, vector<string>>& f, const vector<string>& busm) {
    int l = 0; //переменная для определения наличия нужного маршрута
    for (auto i : f) { //просматриваем контейнер
        if (i.first == s) { //если значение ключа совпало с названием маршрута
            for (auto m : i.second) { // (п.1) то для каждого значения этого ключа
                cout << "Stop " << m << ":"; //пишем остановку
                int l2 = 0; //переменная для определения наличия других маршрутов остановки, кроме первоначального
                vector<string> v;
                for (auto r : f) { //снова пролистываем контейнер
                    for (auto n : r.second) { //просматриваем все значения остановок
                        //и если значение остановки совпало со значением ключа m в п.1, но не равно "введенному" маршруту s
                        if (n == m && r.first != s) {
                            v.push_back(r.first); //запишем маршруты в вектор
                            l2++;
                        }
                    }
                }
                if (l2 == 0) cout << " no interchange";
                else if (l2 > 0) {
                    for (const auto& w : busm) { //пролистаем общий вектор с маршрутами и для каждого маршрута
                        for (auto z : v) { //будем просматривать вектор "найденных" маршрутов 
                            if (z == w) { //и при совпадении
                                cout << " "  << w; //выводим маршрут
                            } //таким образом у нас будут выведены маршруты в порядке записи командой NEW_BUS
                        }
                    }
                }
                cout << endl; //с новой строки
            }
            l++; //если маршрут нашелся, то плюсуем
        }
    }
    if (l == 0) cout << "No bus" << endl; // если не нашлось маршрутов - так и пишем
}
int main()
{
    int Q;
    cin >> Q; //узнаем сколько команд будет
    map<string, vector<string>> bsmap; //создадим контейнер, ключом будет маршрут(строка), а значениями остановки (вектор строк)
    vector<string> busm;
    for (Q; Q > 0; Q--) { //делаем нужное количество циклов
        string comand, bus, stop; //заведем нужные переменные
        cin >> comand; //считываем команду
        if (comand == "NEW_BUS") { //для этой команды
            int sc; //количество остановок
            cin >> bus >> sc; //прочитаем маршрут и количество остановок
            busm.push_back(bus);
            for (sc; sc > 0; sc--) { //и ровно это количество раз
                cin >> stop; //считаем название новой остановки
                bsmap[bus].push_back(stop); //и добавим к маршруту
            }
        }
        else if (comand == "BUSES_FOR_STOP") {
            cin >> stop;
            BusforStop(stop, bsmap, busm); //тут и ниже все происходит в функциях, которые выше
        }
        else if (comand == "STOPS_FOR_BUS") {
            cin >> bus;
            Stopforbus(bus, bsmap, busm);
        }
        else if (comand == "ALL_BUSES") {
            All_buses(bsmap);
        }
    }
    return 0;
}
Кажется, что слишком много кода. Однако программа поставленную задачу решает.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 2
Комментарии
  1. Старый комментарий
    Аватар для Croessmah
    C++
    1
    
    for (auto i : f) { //просматриваем контейнер
    Для поиска ключа в map есть функция-член find.
    Ваш поиск линейный, а find - найдет за логарифм.
    Запись от Croessmah размещена 26.07.2017 в 23:11 Croessmah вне форума
  2. Старый комментарий
    Цитата Сообщение от Croessmah
    C++
    1
    
    for (auto i : f) { //просматриваем контейнер
    Для поиска ключа в map есть функция-член find.
    Ваш поиск линейный, а find - найдет за логарифм.
    Спасибо. Посмотрел решение от Яндекса, у них примерно как у меня. Потихоньку понимаю особенности языка и как там все происходит. find тоже посмотрел, буду изучать библиотеки, документацию. Пока еще мало знаю.
    Запись от acmades размещена 27.07.2017 в 09:45 acmades вне форума
 
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru