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;
		}
	}
};