TopCoder SRM 376 Div1 Easy Trainyard

問題

列車の線路がグリッドにより与えられる。
'|'のマスは縦向きの線路を表し、上下から進入して、上下に出ることができる。
'-'のマスは横向きの線路を表し、左右から進入して、左右に出ることができる。
'+'のマスは交差点の線路を表し、どの方向からも進入して、どの方向にも出ることができる。
'S'のマスはスタートの線路を表す。
'.'は線路がないマスで、進入することはできない。


スタートからはどの方向へも出発することができる。
fuel回以内の移動により到達しうるマスの総数を求めよ。
(マスは、到達可能な移動方法が一通り以上あればよく、一回の移動で全てのマスをたどる必要はない)

制約条件

グリッドの幅≦10
高さ≦10

方針

スタートから、定義にしたがって幅優先探索をする。

ソースコード

const int dy[]={-1,0,1,0},dx[]={0,-1,0,1};

class Trainyard {
	public:
	int reachableSquares(vector <string> layout, int fuel) 
	{
		int h=layout.size(),w=layout[0].size();
		rep(i,h)rep(j,w)if(layout[i][j]=='S'){
			int ans=0;
			queue<pi> q;
			q.push(mp(i*w+j,fuel));
			bool v[10][10]={};
			while(!q.empty()){
				int y=q.front().first/w, x=q.front().first%w;
				int f=q.front().second; q.pop();
				
				if(v[y][x])continue;
				v[y][x]=1;
				if(f==0)continue;
				
				rep(d,4){
					int ny=y+dy[d], nx=x+dx[d];
					if(ny<0||nx<0||ny>=h||nx>=w||v[ny][nx])continue;
					if(layout[ny][nx]=='.'||
						layout[y][x]=='|'&&(d&1)||layout[y][x]=='-'&&!(d&1)||
						layout[ny][nx]=='|'&&(d&1)||layout[ny][nx]=='-'&&!(d&1))continue;
					q.push(mp(ny*w+nx,f-1));
				}
			}
			rep(i,h)rep(j,w)ans+=v[i][j];
			return ans;
		}
	}
};