Website Summary Files Commits Branches @commit @diff @stats
path: root / Seminar03 / task02.cpp
diff options
context:
space:
mode:
Commit7b38c7fa2a76d912ca45576c06b9f900d77b616c (patch)
Author
 Stoycho Kyosev <stoycho.kk@gmail.com>
2022-10-19 13:15:50 +0300
Committer
 Stoycho Kyosev <stoycho.kk@gmail.com>
2022-10-19 13:15:50 +0300
Files2997df965325fb3bf9fcb4c8b31298e9cc615ce6 /Seminar03/task02.cpp
Data-structures-and-algorithms-7b38c7fa2a76d912ca45576c06b9f900d77b616c.tar
Data-structures-and-algorithms-7b38c7fa2a76d912ca45576c06b9f900d77b616c.tar.gz
Data-structures-and-algorithms-7b38c7fa2a76d912ca45576c06b9f900d77b616c.zip
Parent45d4463d1fd0846ebc941e70abd791f5e2c0fccb (diff)
add Sem03
1 files changed, 93 insertions, 0 deletions
-rw-r--r--Seminar03/task02.cpp93
diff --git a/Seminar03/task02.cpp b/Seminar03/task02.cpp
new file mode 100644
index 0000000..e5ab8a7
--- /dev/null
+++ b/Seminar03/task02.cpp
@@ -0,0 +1,93 @@
+#include <iostream>
+#include <array>
+#include <queue>
+
+template<unsigned boardSize = 8>
+class minMoves {
+ using position = std::pair<int, int>;
+ using positionAndSteps = std::pair<position, int>;
+ using board = std::array<std::array<bool, boardSize>, boardSize>;
+
+ board playground;
+
+ void cleanPlayground() {
+ for (auto &col : playground)
+ for (auto &pos : col)
+ pos = false;
+ }
+
+ static bool equalPositions(const position &fst, const position &snd) {
+ return fst.first == snd.first && fst.second == snd.second;
+ }
+
+ static bool isValidPos(const position &p) {
+ return p.first >= 0 && p.second >= 0 && p.first < boardSize && p.second < boardSize;
+ }
+
+ void mark(const position &toMark) {
+ playground[toMark.first][toMark.second] = true;
+ }
+
+ bool isMarked(const position &pos) const {
+ return playground[pos.first][pos.second];
+ }
+
+ void pushAndMarkIfValid(std::queue<positionAndSteps> &q, const position &toPush, int steps) {
+ if (isValidPos(toPush) && !isMarked(toPush)) {
+ q.push({toPush, steps});
+ mark(toPush);
+ }
+ }
+
+ int process(const position &startPos, const position &endPos) {
+ std::queue<positionAndSteps> q;
+
+ q.push({startPos, 0});
+
+ while (!q.empty()) {
+ positionAndSteps currentPosition = q.front();
+
+ q.pop();
+
+ if (equalPositions(currentPosition.first, endPos))
+ return currentPosition.second;
+
+ int x = currentPosition.first.first;
+ int y = currentPosition.first.second;
+ int moves = currentPosition.second + 1;
+
+ pushAndMarkIfValid(q, {x + 1, y + 2}, moves);
+ pushAndMarkIfValid(q, {x - 1, y - 2}, moves);
+ pushAndMarkIfValid(q, {x + 1, y - 2}, moves);
+ pushAndMarkIfValid(q, {x - 1, y + 2}, moves);
+ pushAndMarkIfValid(q, {x + 2, y - 1}, moves);
+ pushAndMarkIfValid(q, {x + 2, y + 1}, moves);
+ pushAndMarkIfValid(q, {x - 2, y + 1}, moves);
+ pushAndMarkIfValid(q, {x - 2, y - 1}, moves);
+ }
+ return -1;
+ }
+
+public:
+ minMoves() { cleanPlayground(); }
+
+ int getMinMoves(const position &start, const position &end) {
+ cleanPlayground();
+
+ return process(start, end);
+ }
+};
+
+int main() {
+ minMoves m;
+
+ std::cout << m.getMinMoves({0, 0}, {5, 3}) << std::endl;
+
+ minMoves<12> ms;
+
+ std::cout << ms.getMinMoves({0, 0}, {11, 11}) << std::endl;
+
+ minMoves<2> mt;
+
+ std::cout << mt.getMinMoves({0, 0}, {12, 212});
+} \ No newline at end of file