#include #include #include #include #include #include using namespace std; using ll = long long; #define rep(i, n) for (int i = 0; i < n; ++i) int main() { ll h, w; cin >> h >> w; vector s(h); rep(i, h) cin >> s[i]; s[0][0] = '.'; s[h-1][w-1] = '.'; ll H = h * 2 - 1; ll W = w * 2 - 1; auto itop = [&](ll i) { return pair{i / W, i % W}; }; auto ptoi = [&](pair p) { return p.first * W + p.second; }; vector> g(H * W); rep(i, h) { rep(j, w) { if(s[i][j] == '.') { if(j < w-1 && s[i][j+1] == '.') { g[ptoi({i * 2, j * 2})].emplace_back(ptoi({i * 2, j * 2 + 2})); } if(i < h-1 && s[i+1][j] == '.') { g[ptoi({i * 2, j * 2})].emplace_back(ptoi({i * 2 + 2, j * 2})); } if(i < h-1) { g[ptoi({i * 2, j * 2})].emplace_back(ptoi({i * 2 + 1, j * 2})); } if(j < w-1) { g[ptoi({i * 2, j * 2})].emplace_back(ptoi({i * 2, j * 2 + 1})); } } } } rep(i, h) { rep(j, w) { if(i != h-1) { g[ptoi({i * 2 + 1, j * 2})].emplace_back(ptoi({i * 2 + 2, j * 2})); } if(j != w-1) { g[ptoi({i * 2, j * 2 + 1})].emplace_back(ptoi({i * 2, j * 2 + 2})); } if(i != h-1 && j != w-1) { g[ptoi({i * 2 + 1, j * 2})].emplace_back(ptoi({i * 2 + 1, j * 2 + 1})); g[ptoi({i * 2 + 1, j * 2})].emplace_back(ptoi({i * 2 + 1, j * 2 + 2})); g[ptoi({i * 2, j * 2 + 1})].emplace_back(ptoi({i * 2 + 1, j * 2 + 1})); g[ptoi({i * 2, j * 2 + 1})].emplace_back(ptoi({i * 2 + 2, j * 2 + 1})); g[ptoi({i * 2 + 1, j * 2 + 1})].emplace_back(ptoi({i * 2 + 2, j * 2 + 1})); g[ptoi({i * 2 + 1, j * 2 + 1})].emplace_back(ptoi({i * 2 + 1, j * 2 + 2})); } } } const ll INF = 1LL<<60; vector dist(H * W, INF); dist[0] = 0; rep(x, H) { rep(d, x+1) { ll idx = ptoi({x-d, d}); for(auto c : g[idx]) { dist[c] = min(dist[c], dist[idx] + 1); } } } rep(y, W) { rep(d, W-y) { ll idx = ptoi({H-1-d, y+d}); for(auto c : g[idx]) { dist[c] = min(dist[c], dist[idx] + 1); } } } cout << (dist.back() == INF ? -1 : dist.back()) << endl; }