2010 ICPC国内予選 B.迷図と命ず

問題概要

グリッド上に描かれた迷路が与えられる。このとき、ゴールまでの最短の道のりを求めよ。
迷路は各グリッドの壁の情報によって与えられる。

解法

入力が壁の情報によってなのでややこしい。
座標を2倍するか、判定をがんばる。


判定を頑張る場合、左右に動くときは縦向きの壁とぶつからないか、上下に動くときは横向きの壁とぶつからないかを判定すればいい。


最短距離は幅優先探索などで適当に。

ソースコード

判定を頑張ったコード。

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

int w,h;
bool tate[40][40],yoko[40][40];

int main(){
	while(cin>>w>>h,w)
	{
		rep(i,2*h-1)
		{
			if(i%2==0)rep(j,w-1)cin>>tate[i][j];
			else rep(j,w)cin>>yoko[i][j];
		}
		
		bool V[40][40]={0};
		queue<pair<int,pi> >Q; Q.push(mp(1,mp(0,0)));
		int ans=inf;
		while(!Q.empty())
		{
			int x=Q.front().second.second,y=Q.front().second.first;
			int cc=Q.front().first; Q.pop();
			
			if(x==w-1&&y==h-1)
			{
				ans=cc; break;
			}
			
			rep(d,4)
			{
				int ny=y+dy[d],nx=x+dx[d];
				if(ny<0||nx<0||ny>=h||nx>=w)continue;
				if(d==0&&yoko[y*2-1][x]||
					d==1&&tate[y*2][x]||
					d==2&&yoko[y*2+1][x]||
					d==3&&tate[y*2][x-1])continue;
				if(!V[ny][nx])Q.push(mp(cc+1,mp(ny,nx))),V[ny][nx]=1;
			}
		}
		cout<<(ans==inf?0:ans)<<endl;
	}
	return 0;
}