#include<bits/stdc++.h>
using namespace std;
const int MAXN=305;
int n,m;
bool vis[MAXN][MAXN];
char ch[MAXN][MAXN];
bool door[30];
int chuansong[30][MAXN][MAXN];
int step[MAXN][MAXN];
int sx,sy,ex,ey;
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
void bfs(int x,int y)
{
queue<pair<int,int> > q;
q.push(make_pair(x,y));
vis[x][y]=true;
while(q.size())
{
int xx=q.front().first;
int yy=q.front().second;
q.pop();
// cout<<xx<<' '<<yy<<'\n';
for(int i=0;i<4;i++)
{
int xxx=xx+dx[i];
int yyy=yy+dy[i];
if(xxx<1||xxx>n||yyy<1||yyy>m) continue;
if(ch[xxx][yyy]=='#'||vis[xxx][yyy]) continue;
if(ch[xxx][yyy]>='A'&&ch[xxx][yyy]<='Z')
{
int p=ch[xxx][yyy]-'A'+1;
int _x1=chuansong[p][1][1],_y1=chuansong[p][1][2];
int _x2=chuansong[p][2][1],_y2=chuansong[p][2][2];
if(xxx==_x1&&yyy==_y1)
{
q.push(make_pair(_x2,_y2));
step[_x2][_y2]=step[xx][yy]+1;
}
else
{
q.push(make_pair(_x1,_y1));
step[_x1][_y1]=step[xx][yy]+1;
}
}
else
{
step[xxx][yyy]=step[xx][yy]+1;
q.push(make_pair(xxx,yyy));
vis[xxx][yyy]=true;
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>ch[i]+1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(ch[i][j]=='@') sx=i,sy=j;
else if(ch[i][j]=='=') ex=i,ey=j;
else if(ch[i][j]>='A'&&ch[i][j]<='Z')
{
if(ch[i][j]>='A'&&ch[i][j]<='Z'&&!door[ch[i][j]-'A'+1])
{
chuansong[ch[i][j]-'A'+1][1][1]=i;
chuansong[ch[i][j]-'A'+1][1][2]=j;
door[ch[i][j]-'A'+1]=true;
}
else
{
chuansong[ch[i][j]-'A'+1][2][1]=i;
chuansong[ch[i][j]-'A'+1][2][2]=j;
}
}
}
}
bfs(sx,sy);
cout<<step[ex][ey];
return 0;
}
TLE+MLE 求调qwq