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