#include<iostream>
#include<cmath>
#include<vector>
#include<map>
#include<queue>
#include<cstring>
using namespace std;
int n, m,startx,starty,arr[301][301][4],ans,siz;
//n为x轴,m为y轴,startx和starty用于记录起点,arr用于记录四个方向是否走过,ans为答案,siz记录每一步的扩展
int dx[4] = { -1,0,1,0 };//dx和dy用于四个方向的前进
int dy[4] = { 0,1,0,-1 };
queue<pair<int, int>>road;//用于广搜道路
map<char, pair<int, int>>tran;//暂时存储传送点
map<pair<int, int>, pair<int, int>>transfussion;//存储传送点
char maze[301][301];//记录地图
void input();//输入函数,方便我调试
int bfs(pair<int, int>dot,int floor)
{
if (maze[dot.first][dot.second] == '=')
return ans;
for (int i = 0; i <4; i++)
{
int tempx = dot.first+dx[i];
int tempy = dot.second+dy[i];
if ( maze[tempx][tempy] != '#' && arr[tempx][tempy][i] == -1)
{
if (maze[tempx][tempy] >= 'A' && maze[tempx][tempy]<='Z')
{
int a = transfussion[make_pair(tempx, tempy)].first;//确认传送的位置
int b = transfussion[make_pair(tempx, tempy)].second;
arr[tempx][tempy][i] = ans;
road.push(make_pair(a, b));
}
else
{
arr[tempx][tempy][i] = ans;
road.push(make_pair(tempx, tempy));
}
}
}
if (floor != 0)
return 0;
while(road.size()!=0)
{
if (siz == 0)
{
siz = road.size();
ans++;
}
int t=bfs(road.front(), floor + 1);
if (t != 0)
return ans;
siz--;
road.pop();
}
return ans;
}
int main()
{
freopen("title.in", "r", stdin);
input();
memset(arr, -1, sizeof(arr));
cout<<bfs(make_pair(startx, starty), 0);
return 0;
}
void input()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
{
for (int t = 0; t < m; t++)
{
cin >> maze[i][t];
if (maze[i][t] <='Z' && maze[i][t] >='A')
{
//map的插入是不可以覆盖的
bool temp = tran.insert(make_pair(maze[i][t], make_pair(i, t))).second;
int temp1 = tran[maze[i][t]].first;
int temp2 = tran[maze[i][t]].second;
if (!temp)
{
transfussion.insert(make_pair(make_pair(i, t), make_pair(temp1, temp2)));
transfussion.insert(make_pair(make_pair(temp1, temp2), make_pair(i, t)));
}
}
else if (maze[i][t] == '@')
{
startx = i;
starty = t;
}
}
}
}
比别人用多了一半多的时间