Summary Files Commits Branches @commit @diff @stats
path: root / Year 2 / Structures and data algorithms / Project / exb / CityVisit.cpp
diff options
context:
space:
mode:
Commit5f4ed7a789dbe338a1113d5498f3038f42b6dfd6 (patch)
Author
 Syndamia <kamen@syndamia.com>
2022-12-29 18:44:30 +0200
Committer
 Syndamia <kamen@syndamia.com>
2022-12-29 18:44:30 +0200
Files88a77dffb9a74cd8e298ceed1fafa6345d3651a2 /Year 2/Structures and data algorithms/Project/exb/CityVisit.cpp
uni-projects-5f4ed7a789dbe338a1113d5498f3038f42b6dfd6.tar
uni-projects-5f4ed7a789dbe338a1113d5498f3038f42b6dfd6.tar.gz
uni-projects-5f4ed7a789dbe338a1113d5498f3038f42b6dfd6.zip
Parent2b25a22595660765cf42cba544dfa222871f86a1 (diff)
[SDP/P] Fixed memory leaks
1 files changed, 88 insertions, 0 deletions
-rw-r--r--Year 2/Structures and data algorithms/Project/exb/CityVisit.cpp88
diff --git a/Year 2/Structures and data algorithms/Project/exb/CityVisit.cpp b/Year 2/Structures and data algorithms/Project/exb/CityVisit.cpp
new file mode 100644
index 0000000..af5128d
--- /dev/null
+++ b/Year 2/Structures and data algorithms/Project/exb/CityVisit.cpp
@@ -0,0 +1,88 @@
+#include "CityVisit.h"
+
+CityVisit::~CityVisit() {
+ for (Landmark* l : landmarks)
+ delete l;
+}
+
+CityVisit::Landmark* CityVisit::find(const std::string& name) {
+ for (Landmark* l : landmarks) {
+ if (l->name == name)
+ return l;
+ }
+ return nullptr;
+}
+
+void CityVisit::pushLandmarks(const std::string& from, const std::string& to, unsigned time) {
+ Landmark* a = find(from);
+ if (a == nullptr) {
+ a = new Landmark(from);
+ landmarks.push_back(a);
+ }
+ Landmark* b = find(to);
+ if (b == nullptr) {
+ b = new Landmark(to);
+ landmarks.push_back(b);
+ }
+
+ a->visitable.push_back({ b, time });
+ b->visitable.push_back({ a, time });
+}
+
+void CityVisit::parse(std::ifstream& inFile) {
+ unsigned k = 0, r = 0;
+ inFile >> k >> r;
+
+ std::string name1;
+ std::string name2;
+ unsigned time = 0;
+ while (r-- > 0) {
+ inFile >> name1 >> name2 >> time;
+ pushLandmarks(name1, name2, time);
+ }
+ inFile >> availableTime;
+}
+
+void CityVisit::visitTheMostInTimeRec(Landmark* currentLandmark, std::deque<Landmark*> currPath, std::deque<Landmark*> unique, int timeLeft, std::deque<Landmark*>& bestPath, unsigned& uniqueCount) {
+ if (timeLeft < 0) return;
+
+ bool currentExists = false;
+ for (const Landmark* l : unique) {
+ if (l == currentLandmark) {
+ currentExists = true;
+ break;
+ }
+ }
+ if (!currentExists)
+ unique.push_back(currentLandmark);
+
+ currPath.push_back(currentLandmark);
+
+ if (currentLandmark->name == "Railstation" && unique.size() > uniqueCount) {
+ bestPath = currPath;
+ uniqueCount = unique.size();
+ }
+
+ for (auto lp : currentLandmark->visitable) {
+ visitTheMostInTimeRec(lp.first, currPath, unique, timeLeft - lp.second, bestPath, uniqueCount);
+ }
+}
+
+std::deque<std::string> CityVisit::visitTheMostInTime(std::ifstream& inFile) {
+ landmarks.clear();
+ parse(inFile);
+
+ Landmark* station = find("Railstation");
+ if (station == nullptr)
+ throw std::logic_error("No landmark named Railstation exists!");
+
+ std::deque<Landmark*> outLandmarks;
+ unsigned uniqueCount = 0;
+ visitTheMostInTimeRec(station, std::deque<Landmark*>(), std::deque<Landmark*>(), availableTime, outLandmarks, uniqueCount);
+
+ std::deque<std::string> out;
+ for (Landmark* l : outLandmarks) {
+ out.push_back(l->name);
+ }
+ return out;
+}