#include<iostream>
#include<queue>
using namespace std;
const int N = 45;
int dx[4]={-1,1,0,0};//上下左右
int dy[4]={0,0,-1,1};
char mp[N][N];
bool vis[N][N];
int n,m;//行 列
//结构体存点信息
struct node {
int x,y,step;
}r,l;//r是代表当前点,l是代表下一点
//开始广搜
void bfs(int x,int y,int step){
//定义一个队列(结构体)
queue<node> q;
//①将起点放入队列,并标记为已访问
q.push({x,y,step});
vis[x][y]=1;
//在队列还有元素的情况下,重复二、三步
while(q.size()){ // 等同于while(!q.empty())
//②取出队首,作为当前点,不要忘记弹出一个空间
r=q.front();
q.pop();
//判断队首是不是目标节点
if(r.xn&&r.ym){
cout<<r.step;//是,就输出
return;
}
//③找当前点的邻居,看是否符合要求,是的话就入队
for(int i=0;i<4;i++){
l.x = r.x + dx[i];//下一点信息
l.y = r.y + dy[i];
l.step = r.step + 1;//步数也加一
//要求:在界内 不是障碍 没有被走过
if(l.x>=1 && l.x<=n && l.y>=1 && l.y<=m && mp[l.x][l.y]!='#' && vis[l.x][l.y]==0){
vis[l.x][l.y] = 1;//标记下一个点可以走
q.push(l);// l入队
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];//输入地图信息
}
}
bfs(1,1,1);//广搜,传入起点坐标(1,1)和初始步数 1
}