#include<bits/stdc++.h>
using namespace std;
// x y 步数
//1 1 2 0
//2
//3
//4
//5
//6
//7
//
//
//
//广搜:
// 做核酸
// 家里最大的去排队
// 把他的儿子都叫出来,然后他才可以走
//
// 首先要队列
// 将起点插入队列
// 只要还有人在排队,我就要处理
// 找他所有的儿子来排队
// 他就可以走了
// 如果找到终点,就输出答案
//
//
//问题:
//队列长啥样,有几个队。。存储什么数据
//STL叫queue
int fx[4]={0,1,0,-1};
int fy[4]={1,0,-1,0};
struct Node{
int x,y,step;
};
queue<Node> q;
int m,n,sx,sy,zx,zy;
char a[50][50];
int main(){
cin>>m>>n;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
if(a[i][j]=='@') sx=i,sy=j;
if(a[i][j]=='*') zx=i,zy=j;
}
}
q.push({sx,sy,0});
a[sx][sy]='#';
while(!q.empty()){
int x=q.front().x;
int y=q.front().y;
int step=q.front().step;
for(int i=0;i<=3;i++){
int tx=x+fx[i];
int ty=y+fy[i];
if(tx>=1&&tx<=m&&ty>=1&&ty<=n&&a[tx][ty]!='#'){
if(tx==zx&&ty==zy){
cout<<step+1;
return 0;
}
q.push({tx,ty,step+1});
a[tx][ty]='#';
}
}
q.pop();
}
cout<<-1;
return 0;
}
/**************************************************************
Problem: 1900
User: admin
Language: C++
Result: Accepted
Time:10 ms
Memory:2080 kb
****************************************************************/