using namespace std;
const int N = 40; // 最大迷宫边长
char maze[N][N];
bool visited[N][N];
int dist[N][N]; // 存储每个格子的步数
int dx[4] = {0, 0, 1, -1}; // 四个方向移动
int dy[4] = {1, -1, 0, 0};
int bfs(int R, int C) {
queue[HTML_REMOVED]> q;
q.push({0, 0}); // 起点
visited[0][0] = true;
dist[0][0] = 1; // 起点步数初始化为 1
while (!q.empty()) {
auto [x, y] = q.front();
q.pop();
// 遍历四个方向
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
// 判断是否在边界内、未访问过、并且是空地
if (nx >= 0 && nx < R && ny >= 0 && ny < C &&
!visited[nx][ny] && maze[nx][ny] == '.') {
q.push({nx, ny});
visited[nx][ny] = true;
dist[nx][ny] = dist[x][y] + 1;
// 如果到达终点,直接返回步数
if (nx == R - 1 && ny == C - 1) {
return dist[nx][ny];
}
}
}
}
return -1; // 正常情况下不会走到这里,因为保证有解
}
int main() {
int R, C;
cin >> R >> C;
for (int i = 0; i < R; i++) {
cin >> maze[i];
}
// 初始化 visited 和 dist 数组
memset(visited, false, sizeof(visited));
memset(dist, 0, sizeof(dist));
// 执行 BFS 并输出结果
cout << bfs(R, C) << endl;
return 0;
}