From efa8485a4cd8587e53f62e3b618e570cc08cc93a Mon Sep 17 00:00:00 2001 From: fernando Date: Fri, 9 Aug 2024 03:04:13 -0600 Subject: [PATCH] primer intento de resolver el laberinto wip --- main.cpp | 111 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 65 insertions(+), 46 deletions(-) diff --git a/main.cpp b/main.cpp index 437e8c2..2617502 100644 --- a/main.cpp +++ b/main.cpp @@ -1,7 +1,7 @@ #include #include -#include "api.h" #include +#include "api.h" #include "mms.h" #define W 15 /* ancho y alto del laberinto -1 */ @@ -11,12 +11,6 @@ struct maze { /* Distancias de Manhattan */ 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; struct fill { @@ -35,6 +29,7 @@ void flood(struct maze* maze, struct mmstats* mmstats) { int marked[16][16]; std::queue myqueue; + /* myqueue.push({6,7,0}); myqueue.push({6,8,0}); myqueue.push({7,6,0}); @@ -44,11 +39,12 @@ void flood(struct maze* maze, struct mmstats* mmstats) { 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; + */ + + myqueue.push({7,7,-1}); + myqueue.push({7,8,-1}); + myqueue.push({8,7,-1}); + myqueue.push({8,8,-1}); API::setText(7, 7, 0); API::setText(7, 8, 0); @@ -61,13 +57,6 @@ void flood(struct maze* maze, struct mmstats* mmstats) { prevNum = myqueue.front().z; myqueue.pop(); - if (mmstats->x == i && mmstats->y == j) { - log("flood end"); - API::setText(i, j, prevNum+1); - maze->mhtn[i][j] = prevNum+1; - break; - } - if (i < 0 || i > W || j < 0 || j > W || marked[i][j]==1) { continue; @@ -76,10 +65,17 @@ void flood(struct maze* maze, struct mmstats* mmstats) { 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}); + if (!maze->vwalls[i][j]) + myqueue.push({i+1, j, prevNum +1}); + + if (!maze->vwalls[i-1][j]) + myqueue.push({i-1, j, prevNum +1}); + + if (!maze->hwalls[i][j]) + myqueue.push({i, j+1, prevNum +1}); + + if (!maze->hwalls[i][j-1]) + myqueue.push({i, j-1, prevNum +1}); } } } @@ -91,30 +87,49 @@ void follow(struct maze maze, class mmstats* mms) { int mht = maze.mhtn[mms->x][mms->y]; int nextmht = mht-1; int next[2]; + int next_L[2]; + int next_R[2]; + int next_B[2]; nextcell(mms->x, mms->y, mms->dir, next); - if(maze.mhtn[next[0]][next[1]] == nextmht) { + nextcell(mms->x, mms->y, mms->head->prev->value, next_L); + nextcell(mms->x, mms->y, mms->head->next->value, next_R); + nextcell(mms->x, mms->y, mms->head->next->next->value, next_B); + if(maze.mhtn[next[0]][next[1]] == nextmht && !API::wallFront() || !API::wallFront() && API::wallLeft() && API::wallRight()) { log("forward"); return; } - nextcell(mms->x, mms->y, mms->head->prev->value, next); - if(maze.mhtn[next[0]][next[1]] == nextmht) { + else if(maze.mhtn[next_L[0]][next_L[1]] <= nextmht && !API::wallLeft()) { API::turnLeft(); mms->turn(left); log("left"); return; } - nextcell(mms->x, mms->y, mms->head->next->value, next); - if(maze.mhtn[next[0]][next[1]] == nextmht) { + else if(maze.mhtn[next_R[0]][next_R[1]] <= nextmht && !API::wallRight()) { API::turnRight(); mms->turn(right); log("right"); return; } - API::turnRight(); - mms->turn(right); - API::turnRight(); - mms->turn(right); - log("180"); + else if(maze.mhtn[next_B[0]][next_B[1]] == nextmht + || API::wallFront() && API::wallLeft() && API::wallRight()) { + API::turnRight(); + mms->turn(right); + API::turnRight(); + mms->turn(right); + log("180"); + return; + } + else if(maze.mhtn[next_R[0]][next_R[1]] <= maze.mhtn[next_B[0]][next_B[1]] && !API::wallRight()){ + API::turnRight(); + mms->turn(right); + log("bRight"); + } + else if(maze.mhtn[next_L[0]][next_L[1]] <= maze.mhtn[next_B[0]][next_B[1]] && !API::wallLeft()){ + API::turnLeft(); + mms->turn(left); + log("bLeft"); + } + log("error en la matri"); } int* nextcell(int i, int j, int dir, int ndir[2]) { @@ -181,15 +196,15 @@ void locateWall(struct maze* maze, class mmstats *mms) { break; case sur: if(API::wallFront() && mms->y != 0) { - maze->vwalls[mms->x][mms->y-1] = 1; + maze->hwalls[mms->x][mms->y-1] = 1; API::setWall(mms->x, mms->y-1, 'n'); } if(API::wallLeft() && mms->x != 15){ - maze->hwalls[mms->x][mms->y] = 1; + maze->vwalls[mms->x][mms->y] = 1; API::setWall(mms->x, mms->y, 'e'); } if(API::wallRight() && mms->x != 0){ - maze->hwalls[mms->x -1][mms->y] = 1; + maze->vwalls[mms->x -1][mms->y] = 1; API::setWall(mms->x -1, mms->y, 'e'); } break; @@ -202,7 +217,7 @@ void locateWall(struct maze* maze, class mmstats *mms) { maze->hwalls[mms->x][mms->y -1] = 1; API::setWall(mms->x, mms->y -1, 'n'); } - if(API::wallRight() && mms->y != 0){ + if(API::wallRight() && mms->y != 15){ maze->hwalls[mms->x][mms->y] = 1; API::setWall(mms->x, mms->y, 'n'); } @@ -218,38 +233,42 @@ int main(int argc, char* argv[]) { mmstats stats; stats.x = 0; stats.y = 0; - - flood(&maze, &stats); - /* + while (true) { + locateWall(&maze, &stats); + flood(&maze, &stats); follow(maze, &stats); - API::moveForward(); - updatepos(&stats); if(maze.mhtn[stats.x][stats.y] == 0){ log("Finish"); return 0; } - log(stats.x); - log(stats.y); - log(""); + //log(stats.x); + //log(stats.y); + API::moveForward(); + updatepos(&stats); + //log(maze.hwalls[stats.x][stats.y]); } - */ + /* while (true) { if (!API::wallLeft()) { locateWall(&maze, &stats); API::turnLeft(); stats.turn(left); + flood(&maze, &stats); } while (API::wallFront()) { locateWall(&maze, &stats); API::turnRight(); stats.turn(right); + flood(&maze, &stats); } locateWall(&maze, &stats); API::moveForward(); updatepos(&stats); + flood(&maze, &stats); log(stats.x); log(stats.y); log(""); } + */ }