#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y,step;
};
int n,m,a,b,c,d;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
char mp[21][21];
bool vis[21][21];//障碍物判断,走过的道路不能再走,地图边界不能越过
void bfs(){
queue<node>q;
q.push({a,b,0});//通过{}将结构体的数据压入到队列中变成一个结构体(C11功能)
vis[a][b]=1;
while(!q.empty()){//队列没有坐标,搜索结束
node fr=q.front();
q.pop();
if(fr.xc && fr.yd){
cout<<fr.step<<endl;
return ;
}
for(int i=0;i<4;i){
int tx=fr.x+dir[i][0];
int ty=fr.y+dir[i][1];
if(tx>=1 && tx<=n && ty>=1 && ty<=m && !vis[tx][ty] && mp[tx][ty]!='#'){
//cout<<mp[tx][ty];
q.push({tx,ty,fr.step+1});
vis[tx][ty]=1;
}
}
}
printf("-1\n");
return ;
}
int main(){
while(1){
for(int i=0;i<21;i++){
for(int j=0;j<21;j++){
vis[i][j]=0;
}
}
cin>>n>>m;
if(n0 && m0){
return 0;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
if(mp[i][j]'@'){
a=i;
b=j;
}
if(mp[i][j]'*'){
c=i;
d=j;
}
}
}
bfs();
}
}