#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 dfs2(int i,int j) { if(i < 0 || j < 0 || i >= h || j >= w || f[i][j])return 0; f[i][j] = true; if(c[i][j] == 'b') { return 1; }else if(c[i][j] != 'a') { int Max = 0; for(int k = 0;k < 4;k++) { int tmp = dfs2(i+dx[k][0],j+dx[k][1])+1; if(tmp)tmp++; Max = max(Max,tmp); } return Max; } return 0; } 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++) { CLR(f); 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]; 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(dfs2(i,j),anser); } cout << anser << endl; return 0; }