RT
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y,dis;
};
queue<node>q;
char a[3009][3009];
bool vis[3009][3009];
int n,m;
int XY[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
int startx,starty;
inline void go_next_node(int &nx,int &ny)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]==a[nx][ny]&&(i!=nx||j!=ny))
{
nx=i,ny=j;
return;
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
string s;
for(int i=1;i<=n;i++)
{
getline(cin,s);
for(int j=1;j<=m;j++)
{
a[i][j]=s[j-1];
if(a[i][j]=='@') startx=i,starty=j;
}
}
q.push((node){startx,starty,0});
while(!q.empty())
{
node temp=q.front();
q.pop();
if(a[temp.x][temp.y]=='='){cout<<temp.dis;return 0;}
if(a[temp.x][temp.y]>='A'&&a[temp.x][temp.y]<='Z')
go_next_node(temp.x,temp.y);
for(int i=0;i<=3;i++)
{
int nextx=temp.x+XY[i][0],nexty=temp.y+XY[i][1];
if(nextx>=1&&nextx<=n&&nexty>=1&&nexty<=m&&a[nextx][nexty]!='#'&&!vis[nextx][nexty])
{
vis[nextx][nexty]=1;
q.push((node){nextx,nexty,temp.dis+1});
}
}
}
return 0;
}