-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrota.cpp
More file actions
210 lines (177 loc) · 7.57 KB
/
Copy pathrota.cpp
File metadata and controls
210 lines (177 loc) · 7.57 KB
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
#include <limits>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <thread>
#include <chrono>
#include <set>
using namespace std;
// Estrutura para representar cada ponto de ônibus
struct BusStop {
string name;
string location;
pair<double, double> coordinates; // (latitude, longitude)
vector<pair<int, int>> buses; // (número do ônibus, minutos até a chegada)
vector<string> peakHours; // Horários de pico
int busFrequency; // Frequência dos ônibus (em minutos)
int busCapacity; // Capacidade dos ônibus
};
// Grafo representando as rotas de ônibus
class BusRouteGraph {
private:
unordered_map<int, BusStop> stops; // Mapa de pontos de ônibus (número do ponto, dados do ponto)
unordered_map<int, vector<int>> adjList; // Lista de adjacência representando as conexões entre pontos de ônibus
public:
// Adiciona um ponto de ônibus ao grafo
void addBusStop(int stopNumber, const string& stopName, const string& stopLocation, double latitude, double longitude) {
stops[stopNumber].name = stopName;
stops[stopNumber].location = stopLocation;
stops[stopNumber].coordinates = make_pair(latitude, longitude);
}
// Adiciona uma aresta entre dois pontos de ônibus (rota de ônibus)
void addEdge(int stopNumber1, int stopNumber2) {
adjList[stopNumber1].push_back(stopNumber2);
adjList[stopNumber2].push_back(stopNumber1); // Se as rotas são bidirecionais
}
// Adiciona um ônibus a um ponto de ônibus com o tempo estimado de chegada
void addBusToStop(int stopNumber, int busNumber, int minutes) {
stops[stopNumber].buses.push_back(make_pair(busNumber, minutes));
}
// Retorna os ônibus que estão a caminho do ponto de ônibus especificado
vector<pair<int, int>>& getBusesApproaching(int stopNumber) {
return stops[stopNumber].buses;
}
// Função para acessar os pontos de ônibus no grafo
unordered_map<int, BusStop>::iterator begin() { return stops.begin(); }
unordered_map<int, BusStop>::iterator end() { return stops.end(); }
// Adiciona uma lista de pontos de ônibus ao grafo
void addBusStops(const vector<pair<int, pair<string, pair<string, pair<double, double>>>>>& busStops) {
for (const auto& stop : busStops) {
addBusStop(stop.first, stop.second.first, stop.second.second.first, stop.second.second.second.first, stop.second.second.second.second);
}
}
// Adiciona uma lista de arestas ao grafo
void addEdges(const vector<pair<int, int>>& edges) {
for (const auto& edge : edges) {
addEdge(edge.first, edge.second);
}
}
// Retorna o nome da localização do ponto de ônibus
string getStopLocation(int stopNumber) {
return stops[stopNumber].location;
}
// Retorna o nome do ponto de ônibus
string getStopName(int stopNumber) {
return stops[stopNumber].name;
}
// Simula a atualização dos tempos de chegada dos ônibus
void updateBusTimes() {
for (auto& stop : stops) {
for (auto& bus : stop.second.buses) {
if (bus.second > 0) {
bus.second--; // Decrementa o tempo de chegada em 1 minuto
}
}
}
}
// Exibe os ônibus a caminho de um ponto específico
void displayBuses(int stopNumber) {
auto approachingBuses = getBusesApproaching(stopNumber);
if (approachingBuses.empty()) {
cout << "Não há ônibus a caminho do ponto " << stopNumber << "." << endl;
} else {
cout << "\nPonto " << stopNumber << ":" << endl;
cout << setw(10) << "Linha" << setw(20) << "Localização" << setw(15) << "Próximo" << setw(25) << "Seguinte" << endl;
cout << "-----------------------------------------------------------------------------" << endl;
for (auto& bus : approachingBuses) {
int currentTime = bus.second; // Tempo atual
int nextTime = currentTime + 1; // Tempo seguinte sempre maior que o atual
cout << setw(10) << bus.first
<< setw(20) << getStopLocation(stopNumber)
<< setw(15) << currentTime << " min"
<< setw(25) << nextTime << " min" << endl;
}
}
}
// Mostra as conexões entre os pontos de ônibus
void showConnections() {
cout << "\nConexões entre pontos de ônibus:" << endl;
for (const auto& pair : adjList) {
cout << "Ponto " << pair.first << " está conectado a: ";
for (const auto& neighbor : pair.second) {
cout << neighbor << " (" << getStopName(neighbor) << ") ";
}
cout << endl;
}
}
// Verifica se um ponto de ônibus existe no grafo
bool isValidStop(int stopNumber) {
return stops.find(stopNumber) != stops.end();
}
// Limpa todos os dados do grafo
void clearGraph() {
stops.clear();
adjList.clear();
}
};
void displaySpinner() {
const char spinner[] = {'|', '/', '-', '\\'};
for (int i = 0; i < 60; ++i) { // 60 segundos
cout << "\rAtualizando em " << (59 - i) << " segundos... " << spinner[i % 4] << flush;
this_thread::sleep_for(chrono::seconds(1));
}
cout << "\r" << string(30, ' ') << "\r"; // Limpa a linha depois que o contador termina
}
int main() {
srand(time(0));
BusRouteGraph graph;
// Exemplo: Adicionando pontos de ônibus com coordenadas fictícias
vector<pair<int, pair<string, pair<string, pair<double, double>>>>> busStops = {
{1234, {"Vila Isabel", {"Goianira", {rand() % 100 / 10.0, rand() % 100 / 10.0}}}},
{5678, {"Itatiaia", {"Goiania", {rand() % 100 / 10.0, rand() % 100 / 10.0}}}},
{3698, {"Setor Universitário", {"Goiania", {rand() % 100 / 10.0, rand() % 100 / 10.0}}}}
};
graph.addBusStops(busStops);
// Exemplo: Adicionando arestas entre pontos de ônibus
vector<pair<int, int>> edges = {
{1234, 3698},
{3698, 5678},
{5678, 1234}
};
graph.addEdges(edges);
// Exemplo: Adicionando ônibus aos pontos de ônibus
graph.addBusToStop(1234, 113, 10);
graph.addBusToStop(5678, 105, 12);
graph.addBusToStop(5678, 263, 5);
graph.addBusToStop(3698, 132, 7);
// Loop para simular atualizações e entrada do usuário
while (true) {
// Simulação de entrada do usuário
int userStop;
cout << "\nInsira o número do ponto de ônibus (-1 para sair): ";
cin >> userStop;
if (userStop == -1) break;
// Verifica se o ponto de ônibus é válido
while (!graph.isValidStop(userStop)) {
cout << "Ponto de ônibus não encontrado. Digite novamente: ";
cin >> userStop;
}
while (true) {
// Atualiza os tempos de chegada dos ônibus
graph.updateBusTimes();
// Exibe os ônibus a caminho do ponto inserido
graph.displayBuses(userStop);
// Mostrar conexões entre pontos de ônibus
graph.showConnections();
// Exibe o spinner e espera por 1 minuto
displaySpinner();
// Limpa a tela para a próxima atualização
system("clear");
}
}
return 0;
}