#include #include #include #include #include #include using namespace std; using i32 = int; using u32 = unsigned int; using i64 = long long; using u64 = unsigned long long; #define rep(i,n) for(int i=0; i<(int)(n); i++) const i64 INF = 1001001001001001001; using Modint = atcoder::static_modint<998244353>; int main(){ int H,W; cin >> H >> W; vector G(H+2); G[0] = G[H+1] = string(W+2, '#'); rep(y,H){ string s; cin >> s; G[y+1] = "#" + s + "#"; } H += 2; W += 2; rep(y,4) rep(x,4) G[y][x] = G[H-1-y][W-1-x] = 'V'; auto dsu = atcoder::dsu(H*W); rep(y0,H) rep(x0,W) rep(y1,H) rep(x1,W) if(G[y0][x0] == '#' && G[y1][x1] == '#'){ if(abs(y0-y1) + abs(x0-x1) != 6 && abs(y0-y1) <= 3 && abs(x0-x1) <= 3){ dsu.merge(y0*W+x0, y1*W+x1); } } int p0 = W-1, p1 = W*(H-1); if(dsu.same(p0, p1)){ cout << "0\n"; return 0; } rep(y,H) rep(x,W) if(G[y][x] == '.'){ int C = 0; for(int dy=-3; dy<=3; dy++) for(int dx=-3; dx<=3; dx++) if(abs(dy) + abs(dx) <= 5){ int ny = y + dy, nx = x + dx; if(ny >= 0 && ny < H && nx >= 0 && nx < W){ if(dsu.same(ny*W+nx, p0)) C |= 1; if(dsu.same(ny*W+nx, p1)) C |= 2; } } if(C == 3){ cout << "1\n"; return 0; } } cout << "2\n"; return 0; } struct ios_do_not_sync{ ios_do_not_sync(){ ios::sync_with_stdio(false); cin.tie(nullptr); } } ios_do_not_sync_instance;