TopCoder SRM 371 Div1 Easy SpiralRoute
問題
width x lengthのグリッドを、(0,0)をスタートして、
壁(グリッドの外周)にぶつかるか、今まで訪れたマスを再び訪れてしまうとき左に曲がる。
最後に訪れるマスはどこか、求めよ。
制約条件
width,length≦5000
方針
一歩ずつシミュレートすればよい。
ソースコード
const int dy[]={0,1,0,-1},dx[]={1,0,-1,0}; bool v[5000][5000]; class SpiralRoute { public: vector <int> thronePosition(int width, int length) { memset(v,0,sizeof(v)); int y=0, x=0, d=0, cnt=0; for(;;){ v[y][x]=1; int ny=y+dy[d], nx=x+dx[d]; if(ny<0||ny>=length||nx<0||nx>=width||v[ny][nx]){ d=d+1&3; if(++cnt>1){ vi ans; ans.pb(x); ans.pb(y); return ans; } continue; } y=ny; x=nx; cnt=0; } } };