#include #include #include #include using namespace std; const int INF = 1e9; int main() { int H, W; cin >> H >> W; vector C(H); for (int i = 0; i < H; ++i) cin >> C[i]; vector> dist(H, vector(W, INF)); priority_queue>, vector>>, greater>>> pq; dist[0][0] = 0; pq.push({0, {0, 0}}); int dy[] = {1, -1, 0, 0}; int dx[] = {0, 0, 1, -1}; while (!pq.empty()) { int d = pq.top().first; int y = pq.top().second.first; int x = pq.top().second.second; pq.pop(); if (d > dist[y][x]) continue; for (int i = 0; i < 4; ++i) { int ny = y + dy[i]; int nx = x + dx[i]; if (ny < 0 || ny >= H || nx < 0 || nx >= W) continue; int cost = (C[ny][nx] == '#') ? 2 : 1; if (dist[ny][nx] > dist[y][x] + cost) { dist[ny][nx] = dist[y][x] + cost; pq.push({dist[ny][nx], {ny, nx}}); } } } if (dist[H - 1][W - 1] == INF) cout << -1 << endl; else cout << dist[H - 1][W - 1] << endl; return 0; }