#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
char a[305][305];
struct node
{
int x[2],y[2];
}ctp[30];
int just=0;
int ans=200000;
int vis[305][305];
int sum[30];
int stx,sty;
void dfs(int x,int y,int step)
{
if(x<1||y<1||x>n||y>m){
return;
}
if(vis[x][y]==1||vis[x][y]==3){
return;
}
if(a[x][y]=='#'){
return;
}
if(step>ans){
return;
}
//cout<<x<<" "<<y<<" "<<step<<endl;
if(a[x][y]=='='){
ans=min(ans,step);
return;
}
if(vis[x][y]==0){
vis[x][y]=1;
}
if(a[x][y]=='.'){
dfs(x+1,y,step+1);
dfs(x-1,y,step+1);
dfs(x,y-1,step+1);
dfs(x,y+1,step+1);
vis[x][y]=0;
}else{
if(vis[x][y]==2){
vis[x][y]=3;
}else{
vis[x][y]=2;
}
int use=a[x][y]-'A';
if(sum[use]<2||just==1){
just=0;
dfs(x+1,y,step+1);
dfs(x-1,y,step+1);
dfs(x,y-1,step+1);
dfs(x,y+1,step+1);
vis[x][y]=0;
}else{
just=1;
if(x==ctp[use].x[1]&&y==ctp[use].y[1]){
dfs(ctp[use].x[0],ctp[use].y[0],step);
}else{
dfs(ctp[use].x[1],ctp[use].y[1],step);
}
vis[x][y]=0;
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int i1=1;i1<=m;i1++){
cin>>a[i][i1];
if(a[i][i1]>='A'&&a[i][i1]<='Z'){
int cur=a[i][i1]-'A';
ctp[cur].x[sum[cur]]=i;
ctp[cur].y[sum[cur]]=i1;
sum[cur]++;
}
if(a[i][i1]=='@'){
stx=i;
sty=i1;
}
}
}
dfs(stx,sty,0);
cout<<ans;
return 0;
}
有一些TLE