评测记录
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
};
int qx,qy,zx,zy;
int n,m;
char ch[305][305];
int X[3][30];
int Y[3][30];
int g[305][305];
int dx[]={1,0,-1,0};
int dy[]={0,-1,0,1};
int bfs()
{
queue<node> q;
memset(g,-1,sizeof(g));
g[qx][qy]=0;
q.push({qx,qy});
while(!q.empty())
{
int nx=q.front().x,ny=q.front().y;
q.pop();
if(ch[nx][ny]>='A'&&ch[nx][ny]<='Z')
{
int op=(int)(ch[nx][ny]-'A'+1);
if(X[1][op]==nx)
{
if(g[X[2][op]][Y[2][op]]!=-1)
{
for(int i=0;i<4;i++)
{
int tx=nx+dx[i],ty=ny+dy[i];
if(tx>=1&&ty>=1&&tx<=n&&ty<=m&&g[tx][ty]==-1&&ch[tx][ty]!='#')
{
g[tx][ty]=g[nx][ny]+1;
q.push({tx,ty});
}
}
continue;
}
q.push({X[2][op],Y[2][op]});
g[X[2][op]][Y[2][op]]=g[nx][ny];
}
else
{
if(g[X[1][op]][Y[1][op]]!=-1)
{
for(int i=0;i<4;i++)
{
int tx=nx+dx[i],ty=ny+dy[i];
if(tx>=1&&ty>=1&&tx<=n&&ty<=m&&g[tx][ty]==-1&&ch[tx][ty]!='#')
{
g[tx][ty]=g[nx][ny]+1;
q.push({tx,ty});
}
}
continue;
}
q.push({X[1][op],Y[1][op]});
g[X[1][op]][Y[1][op]]=g[nx][ny];
}
}
else
{
for(int i=0;i<4;i++)
{
int tx=nx+dx[i],ty=ny+dy[i];
if(tx>=1&&ty>=1&&tx<=n&&ty<=m&&g[tx][ty]==-1&&ch[tx][ty]!='#')
{
g[tx][ty]=g[nx][ny]+1;
q.push({tx,ty});
}
}
}
}
return g[zx][zy];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>ch[i][j];
if(ch[i][j]=='=')
{
zx=i,zy=j;
}
else if(ch[i][j]=='@')
{
qx=i,qy=j;
}
}
}
for(int k=1;k<=26;k++)
{
char op=k+'A'-1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(ch[i][j]==op)
{
if(!X[1][k])
{
X[1][k]=i;
Y[1][k]=j;
}
else
{
X[2][k]=i;
Y[2][k]=j;
}
}
}
}
}
cout<<bfs();
return 0;
}