1166-Amazing Mazes

問題概要

(略)

考え方

最短経路問題.与えられる入力の形を上手く生かしてBFSすることが出来る.計算量はO(WH)となる.

実装(C++)

#include <iostream>
#include <vector>
#include <sstream>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
#define REP(i,x)for(int i=0;i<(int)x;i++)
int h,w;
vector<string> MAP;
string in;
typedef pair<int,int> P;
int ac[800][800];
int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};
int solve(){
	memset(ac,0x7F,sizeof(ac));
	ac[0][0]=0;
	queue<P> que;
	que.push(P(0,0));
	while(!que.empty()){
		P t=que.front();que.pop();
		int now=ac[t.first][t.second];
		//cout<<t.first<<","<<t.second<<":"<<now<<endl;
		if(t.first==w-1&&t.second==h-1){
			return now/2+1;
		}
		REP(i,4){
			int nx=t.first+dx[i],ny=t.second+dy[i];
			if(nx%2==1&&ny%2==1)continue;
			if(nx<0||nx>=w||ny<0||ny>=h)continue;
			if(MAP[nx][ny]=='1')continue;
			if(ac[nx][ny]>now+1){
				ac[nx][ny]=now+1;
				que.push(P(nx,ny));
			}
		}
	}
	return 0;
}
int main() {
	for(;getline(cin,in);){
		stringstream ss(in);
		ss>>w>>h;
		if(w==0||h==0)break;
		MAP.clear();
		REP(i,h*2-1){
			getline(cin,in);
			MAP.push_back(in);
			if(i%2==0)MAP[i]=MAP[i]+" ";
		}
		w=w*2-1;
		h=h*2-1;
		swap(w,h);
		cout << solve() << endl;
	}
	return 0;
}