现在32分了
```cpp
#include<bits/stdc++.h>
using namespace std;
const int N=10000010,M=50000010;
struct edge
{
int to,dis,next;
}e[M];
int head[N],dis[N],n,m,s,cnt;
bool vis[N];
inline void add(const int u,const int v,const int w)
{
++cnt;
e[cnt].dis=w;
e[cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
++cnt;
e[cnt].dis=w;
e[cnt].to=u;
e[cnt].next=head[v];
head[v]=cnt;
}
struct node
{
int dis,pos;
inline bool operator < (const node &x)const
{
return x.dis<dis;
}
};
priority_queue<node>q;
inline void dijkstra()
{
dis[s]=0;
q.push((node){0,s});
while(!q.empty())
{
node tmp=q.top();
q.pop();
int x=tmp.pos;
if(vis[x])continue;
vis[x]=1;
for(int i=head[x];i;i=e[i].next)
{
int y=e[i].to;
if(dis[y]>dis[x]+e[i].dis)
{
dis[y]=dis[x]+e[i].dis;
if(!vis[y])
{
q.push((node){dis[y],y});
}
}
}
}
}
bool vv[N];
char tu[505][505];
int t;
inline int findA(int N,int M,char A)
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(tu[i][j]==A&&(i!=N||j!=M))return (i-1)*m+j;
}
}
}
inline void chuan()
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(tu[i][j]>='A'&&tu[i][j]<='Z'&&!vv[tu[i][j]-'A'])
{
vv[tu[i][j]-'A']=1;
add((i-1)*m+j,findA(i,j,tu[i][j]),0);
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n >> m;
for(int i=1;i<=n*m;++i)dis[i]=0x7fffffff;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
cin >> tu[i][j];
if(tu[i][j]=='@')s=(i-1)*m+j;
if(tu[i][j]=='=')t=(i-1)*m+j;
}
}
chuan();
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(tu[i][j]=='#')continue;
if(tu[i+1][j]!='#'&&i+1<=n&&i+1>=1)add((i-1)*m+j,i*m+j,1);
if(tu[i-1][j]!='#'&&i-1<=n&&i-1>=1)add((i-1)*m+j,(i-2)*m+j,1);
if(tu[i][j+1]!='#'&&j+1<=n&&j+1>=1)add((i-1)*m+j,(i-1)*m+j+1,1);
if(tu[i][j-1]!='#'&&j-1<=n&&j-1>=1)add((i-1)*m+j,(i-1)*m+j-1,1);
}
}
dijkstra();
cout << dis[t];
return 0;
}
```
by liu3600 @ 2024-03-02 11:53:33