#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define REP(i,n) FOR(i,0,n) #define CLR(a) memset((a), 0 ,sizeof(a)) #define MCLR(a) memset((a), -1 ,sizeof(a)) //遷移数 const int TMAX = 4; //遷移変数 int dx[TMAX][2] = {{ 1, 0}, {-1, 0}, { 0, 1}, { 0,-1},}; int w,h; char c[21][21]; bool f[21][21];//フラグ CLR(f); int bfs(int i,int j) { if(i < 0 || j < 0 || i >= h || j >= w || f[i][j])return 0; f[i][j] = true; queue> q; q.push( pair(i,j) ); while(!q.empty()) { pair now = q.front();q.pop(); f[now.first][now.second] = true; if(c[now.first][now.second] == 'b') { return abs(now.first-i)+abs(now.second-j)-1; } for(int k = 0;k < 4;k++) { int x = now.first+dx[k][0],y = now.second+dx[k][1]; if((x >= 0 && y >= 0 && x < h && y < w && !f[x][y])) { q.push(pair(x,y)); } } } return 99999999; } int dfs(int i,int j,char ma) { if(i < 0 || j < 0 || i >= h || j >= w || f[i][j])return 0; f[i][j] = true; if(c[i][j] == '#')return 0; if(c[i][j] == '.') { for(int k = 0;k < 4;k++) dfs(i+dx[k][0],j+dx[k][1],ma); c[i][j] = ma; return 1; } return 0; } void cast(char ma) { for(int i = 0;i < h;i++) for(int j = 0;j < w;j++) { if(dfs(i,j,ma))return; } } int main() { cin >> w >> h; for(int i = 0;i < h;i++) for(int j = 0;j < w;j++) cin >> c[i][j]; CLR(f); cast('a'); cast('b'); int anser = 99999999; for(int i = 0;i < h;i++) for(int j = 0;j < w;j++) { CLR(f); if(c[i][j] == 'a') { anser = min(bfs(i,j),anser); } } cout << anser << endl; return 0; }