#define OLC_PGE_APPLICATION #include "pixelGameEngine.h" #include "olcutils.h" using namespace olc; enum Direction{ NORTH, EAST, SOUTH, WEST, INVALID }; struct Blizzard{ vi2d pos; Direction dir; bool moved=false; }; int maxWidth=0; vi2d playerPos={1,0}; std::vector>>boardState; std::vector> getBoard(int minute){ if (minute> prevBoardState=getBoard(minute-1); for (int y=0;y&blizzardList=prevBoardState[y]; for (int x=0;x&blizzardList=prevBoardState[y]; blizzardList.reserve(100); for (int x=0;xpush_back(b); blizzardList.erase(blizzardList.begin()+x--); }break; case EAST:{ vi2d dest={b.pos.x+1,b.pos.y}; if (dest.x>=maxWidth-1){ dest.x=1; } b.pos=dest; }break; case SOUTH:{ vi2d dest={b.pos.x,b.pos.y+1}; if (dest.y>=prevBoardState.size()-1){ dest.y=1; } b.pos=dest; (&prevBoardState[dest.y])->push_back(b); blizzardList.erase(blizzardList.begin()+x--); }break; case WEST:{ vi2d dest={b.pos.x-1,b.pos.y}; if (dest.x<1){ dest.x=maxWidth-2; } b.pos=dest; }break; } } } } boardState.push_back(prevBoardState); return prevBoardState; } } vi2d targetPos={0,0}; int shortestDist=INFINITY; bool spaceFree(std::vector>&board,const vi2d&pos){ for (int i=0;ishortestDist||minute>1000){ return;//We don't care anymore. } if (pos==targetPos){ if (shortestDist>minute){ shortestDist=minute; std::cout<<"Shortest is now "<>board=getBoard(minute); if (pos==vi2d{1,0}){ if ((pos.y"); } if ((pos.y1&&spaceFree(board,{pos.x,pos.y-1})){ //std::cout<<"Trying Up..."<1&&spaceFree(board,{pos.x-1,pos.y})){ //std::cout<<"Trying Left..."<>board; while (file.good()){ std::string line; std::getline(file,line); if (line.length()>0){ std::cout<boardRow; boardRow.reserve(100); for (int i=0;i'?Direction::EAST:line[i]=='v'?Direction::SOUTH:line[i]=='<'?Direction::WEST:Direction::INVALID}); } } maxWidth=line.length(); board.push_back(boardRow); } } targetPos={maxWidth-2,(int)board.size()-1}; std::cout<'; }break; case SOUTH:{ std::cout<<'v'; }break; case WEST:{ std::cout<<'<'; }break; case INVALID:{ std::cout<<'?'; }break; } prevBlizzard=b.pos.x; } for (int k=prevBlizzard;k>board=getBoard(i+1); for (int y=0;ysorted=board[y]; std::sort(sorted.begin(),sorted.end(),[](Blizzard&b1,Blizzard&b2){return b1.pos.x'; }break; case SOUTH:{ std::cout<<'v'; }break; case WEST:{ std::cout<<'<'; }break; case INVALID:{ std::cout<<'?'; }break; } prevBlizzard=b.pos.x; } } for (int k=prevBlizzard;k