int DirToMask(POINT dir) { return (dir.imag()==+1)?1: (dir.imag()==-1)?2: (dir.real()==-1)?4: (dir.real()==+1)?8: 0; }
void Walk(const char* path,POINT &pos,POINT &dir, POINT &minpt,POINT &maxpt) { POINT enter_dir=dir;///enter direction for cell path++; pos+=dir; ///enter maze for(;*path;path++) { switch(*path) { case 'W': if(minpt.real()>pos.real())minpt.real()=pos.real(); if(minpt.imag()>pos.imag())minpt.imag()=pos.imag(); if(maxpt.real()<pos.real())maxpt.real()=pos.real(); if(maxpt.imag()<pos.imag())maxpt.imag()=pos.imag(); ///break walls in enter and exit directions maze[std::make_pair(pos.real(),pos.imag())]|=DirToMask(-enter_dir); maze[std::make_pair(pos.real(),pos.imag())]|=DirToMask(+dir); pos+=dir; enter_dir=dir; break; case 'L': dir*=POINT(0,1); break; case 'R': dir*=POINT(0,-1); break; } } }