From 7f4a3ae4142d70faf021826a8615365cdd7677df Mon Sep 17 00:00:00 2001 From: fernando Date: Tue, 6 Aug 2024 04:05:01 -0600 Subject: [PATCH] Implemente el algoritmo floodfill --- api.cpp | 9 ++++++ api.h | 4 +++ main.cpp | 92 +++++++++++++++++++++++++++++++++++++++++++++++++------- makefile | 10 ++++++ 4 files changed, 104 insertions(+), 11 deletions(-) create mode 100644 makefile diff --git a/api.cpp b/api.cpp index 37e308a..00547ff 100644 --- a/api.cpp +++ b/api.cpp @@ -89,6 +89,9 @@ void API::clearAllColor() { void API::setText(int x, int y, const std::string& text) { std::cout << "setText " << x << " " << y << " " << text << std::endl; } +void API::setText(int x, int y, const int& text) { + std::cout << "setText " << x << " " << y << " " << text << std::endl; +} void API::clearText(int x, int y) { std::cout << "clearText " << x << " " << y << std::endl; @@ -110,3 +113,9 @@ void API::ackReset() { std::string ack; std::cin >> ack; } +void log(const std::string& text) { + std::cerr << text << std::endl; +} +void log(const int& num) { + std::cerr << num << std::endl; +} diff --git a/api.h b/api.h index 691a1ff..64d1a61 100644 --- a/api.h +++ b/api.h @@ -25,6 +25,7 @@ public: static void clearAllColor(); static void setText(int x, int y, const std::string& text); + static void setText(int x, int y, const int& text); static void clearText(int x, int y); static void clearAllText(); @@ -32,3 +33,6 @@ public: static void ackReset(); }; + +void log(const std::string&); +void log(const int&); diff --git a/main.cpp b/main.cpp index 5ca6628..34f89e7 100644 --- a/main.cpp +++ b/main.cpp @@ -1,27 +1,97 @@ -#include #include - +#include #include "api.h" -void log(const std::string& text) { - std::cerr << text << std::endl; -} -void log(const int& num) { - std::cerr << num << std::endl; +#include + +struct mmstats { + int y; + int x; +}stats; + +struct fill { + int x, y, z; +}; + +struct maze { /* Distancias de Manhattan */ + public: + int vwalls[15][15]; + int hwalls[15][15]; + int mhtn[16][16]; + maze(){ + mhtn[7][7] = 0; /* las celdas del centro tienen */ + mhtn[7][8] = 0; /* un valor de cero porque son */ + mhtn[8][7] = 0; /* la meta. */ + mhtn[8][8] = 0; + } +}maze; + +void flood(struct maze*, struct mmstats*); + +void flood(struct maze* maze, struct mmstats* mmstats) { + const int w = 15; /* X lenght*/ + int i, j; + int prevNum; + int marked[16][16]; + std::queue myqueue; + + myqueue.push({6,7,0}); + myqueue.push({6,8,0}); + myqueue.push({7,6,0}); + myqueue.push({8,6,0}); + + myqueue.push({9,7,0}); + myqueue.push({9,8,0}); + myqueue.push({7,9,0}); + myqueue.push({8,9,0}); + + + marked[7][7] = 1; /* las celdas del centro tienen */ + marked[7][8] = 1; /* un valor de cero porque son */ + marked[8][7] = 1; /* la meta. */ + marked[8][8] = 1; + + while (myqueue.size()) { + i = myqueue.front().x; + j = myqueue.front().y; + prevNum = myqueue.front().z; + myqueue.pop(); + + if (mmstats->x == i && mmstats->y == j) { + log("flood end"); + break; + } + + if (i < 0 || i > w || j < 0 || j > w + || marked[i][j]==1) { + continue; + } + else { + API::setText(i, j, prevNum+1); + maze->mhtn[i][j] = prevNum+1; + marked[i][j] = 1; + myqueue.push({i+1, j, prevNum +1}); + myqueue.push({i-1, j, prevNum +1}); + myqueue.push({i, j+1, prevNum +1}); + myqueue.push({i, j-1, prevNum +1}); + } + } } int main(int argc, char* argv[]) { log("Running..."); API::setColor(0, 0, 'G'); -// API::setText(0, 0, "abc"); +// API::setText(0, 0, "abc"); API::setWall(1, 0, 'e'); - while (true) { + stats = {0,0}; + flood(&maze, &stats); + + while (false) { if (!API::wallLeft()) { API::turnLeft(); - //std::cerr << API::mazeWidth() << std::endl; } while (API::wallFront()) { API::turnRight(); } API::moveForward(); - } + } } diff --git a/makefile b/makefile new file mode 100644 index 0000000..e26bda9 --- /dev/null +++ b/makefile @@ -0,0 +1,10 @@ +SRC = *.cpp +CC = g++ +#ARGS = -lstdc++ -g -Wall +ARGS = -g -Wall + +compile: ${SRC} + ${CC} ${ARGS} $^ -o a.out + +run: compile + @./a.out