diff --git a/C++ProjectTemplate b/C++ProjectTemplate index b54cf80..8c19bf9 100755 Binary files a/C++ProjectTemplate and b/C++ProjectTemplate differ diff --git a/main.cpp b/main.cpp index 0acc582..736a22a 100644 --- a/main.cpp +++ b/main.cpp @@ -4,62 +4,25 @@ using namespace olc; -std::vector validPathStepCounts; +struct node{ + char elevation='a'; + bool visited=false; + std::vectorconnections; + int myDist=INFINITY; + int storedDist=INFINITY; + vi2d pos; + node*parent=nullptr; + node(char elevation){ + this->elevation=elevation; + }; +}; + + vi2d playerPos={0,0}; vi2d endingPos={0,0}; -std::vector>grid; -int lowest=2468; - -void step(char currentTile,vi2d pos,int xoffset,int yoffset,int stepCount,std::vector>visitedgrid,std::string currentPath){ - pos.x+=xoffset; - pos.y+=yoffset; - std::cout<lowest){ - //std::cout<<"Took too long..."<=visitedgrid[0].size()||pos.y>=visitedgrid.size()){ - //std::cout<<"Dead end reached in "<='y')){ - currentPath+=visitedgrid[pos.y][pos.x]; - if (visitedgrid[pos.y][pos.x]=='E'){ - validPathStepCounts.push_back(++stepCount); - if (stepCount>newvisitedgrid=visitedgrid; - step(newTile,pos,0,1,stepCount,newvisitedgrid,currentPath); - } - if (pos.y-1>=0&&visitedgrid[pos.y-1][pos.x]!='0'&&yoffset!=1){ - //visitedgrid[pos.y-1][pos.x]='0'; - std::vector>newvisitedgrid=visitedgrid; - step(newTile,pos,0,-1,stepCount,newvisitedgrid,currentPath); - } - if (pos.x-1>=0&&visitedgrid[pos.y][pos.x-1]!='0'&&xoffset!=1){ - //visitedgrid[pos.y][pos.x-1]='0'; - std::vector>newvisitedgrid=visitedgrid; - step(newTile,pos,-1,0,stepCount,newvisitedgrid,currentPath); - } - if (pos.x+1>newvisitedgrid=visitedgrid; - step(newTile,pos,1,0,stepCount,newvisitedgrid,currentPath); - } - } -} +std::vector>grid; +node*startNode; +node*endNode; int main() { @@ -67,10 +30,10 @@ int main() while (file.good()){ std::string line; std::getline(file,line); - std::vectorrow; + std::vectorrow; if (line.length()>0){ for (int x=0;x0){ + grid[y][x].connections.push_back(&grid[y][x-1]); + } + if (x0){ + grid[y][x].connections.push_back(&grid[y-1][x]); + } + if (y>visitedgrid=grid; - std::vector>visitedgrid2=grid; - std::vector>visitedgrid3=grid; - std::vector>visitedgrid4=grid; - std::cout<<"Part 1"<searchNodes; + searchNodes.push_back(startNode); + while (searchNodes.size()>0){ + node*currentNode=searchNodes.front(); + if (currentNode==startNode){ + currentNode->myDist=pow(currentNode->pos.x-endNode->pos.x,2)+pow(currentNode->pos.y-endNode->pos.y,2); + } + currentNode->visited=true; + if (currentNode->elevation=='S'){ + currentNode->elevation='a'-1; + } + if (currentNode->elevation=='E'){ + currentNode->elevation='z'+1; + } + for (int i=0;iconnections.size();i++){ + node*neighbor=currentNode->connections[i]; + if (neighbor==endNode){ + //We can't go any higher. + endNode->parent=currentNode; + break; + } + if (neighbor->elevation-1<=currentNode->elevation){ + if (neighbor->parent==nullptr||currentNode->myDiststoredDist){ + neighbor->parent=currentNode; + neighbor->storedDist=currentNode->myDist; + neighbor->myDist=pow(neighbor->pos.x-endNode->pos.x,2)+pow(neighbor->pos.y-endNode->pos.y,2); + if (!neighbor->visited){ + searchNodes.push_back(neighbor); + } + } + } + } + searchNodes.erase(searchNodes.begin()); + } + + node*searchNode=endNode; + int jumps=0; + while (searchNode!=startNode){ + std::cout<<"Node goes from "<pos<<" to "<parent->pos<parent; } - std::cout<<"Best: "<