https://www.luogu.com.cn/record/184235263
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
int n,m,sx,sy;
char maze[305][305];
struct node
{
int x,y,dis,transfer;
};
struct node2
{
int x,y;
}point[100];
node2 slide[305][305];
bool vis[305][305];
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
queue<node> q;
int bfs()
{
q.push({sx,sy,0,0});
vis[sx][sy]=1;
while(!q.empty())
{
node now=q.front();
q.pop();
// cout<<maze[now.x][now.y]<<'\n';
//cout<<"("<<now.x<<","<<now.y<<')'<<'\n';
if(maze[now.x][now.y]=='=') return now.dis;
//考虑正常转移
if(1)//now.transfer==(maze[now.x][now.y]<'A'||maze[now.x][now.y]>'Z'))
{
for(int i=0;i<4;i++)
{
int tx=now.x+dir[i][0];
int ty=now.y+dir[i][1];
//cout<<"------("<<tx<<","<<ty<<')'<<'\n';
if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&!vis[tx][ty]&&maze[tx][ty]!='#')
{
// cout<<"p";
vis[tx][ty]=1;
q.push({tx,ty,now.dis+1,0});
}
}
}
//考虑传送门转移
if(now.transfer==0&&(slide[now.x][now.y].x!=0||slide[now.x][now.y].y!=0)&&!vis[slide[now.x][now.y].x][slide[now.x][now.y].y])
{
// cout<<"t";
vis[slide[now.x][now.y].x][slide[now.x][now.y].y]=1;
q.push({slide[now.x][now.y].x,slide[now.x][now.y].y,now.dis,1});
}
}
return -1;
}
int main()
{
// freopen("b.cpp","r",stdin);
// freopen("ans","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>maze[i][j];
if(maze[i][j]>='A'&&maze[i][j]<='Z')
{
if(point[maze[i][j]].x==0&&point[maze[i][j]].y==0) point[maze[i][j]]={i,j};
else
{
slide[i][j]=point[maze[i][j]];
slide[point[maze[i][j]].x][point[maze[i][j]].y]={i,j};
}
}
if(maze[i][j]=='@')
{
sx=i;sy=j;
}
}
}
cout<<bfs();
return 0;
}