#include <unordered_map>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int dx[5] = {0, 0, 1, 0, -1}, dy[5] = {0, 1, 0, -1, 0}, inf = 0x3f3f3f3f;
int n, m;
char arr[310][310];
bool vis[310][310];
struct State {
int x, y, t;
};
unordered_multimap<char, pair<int, int> > portals;
pair<int, int> start, finish;
queue<State> q;
inline pair<int, int> getAnother(char p, pair<int, int> pos) {
auto range = portals.equal_range(p);
auto first = range.first, second = range.first;
advance(second, 1);
if(first->second == pos) return second->second;
return first->second;
}
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) {
cin >> arr[i][j];
if(arr[i][j] == '@') start = {i, j};
else if(arr[i][j] == '=') finish = {i, j};
else if(isalpha(arr[i][j])) portals.insert({arr[i][j], {i, j}});
}
q.push({start.first, start.second, 0});
while(q.size()) {
auto cur = q.front();
q.pop();
if(vis[cur.x][cur.y]) continue;
vis[cur.x][cur.y] = true;
cout << "cur: " << cur.x << ' ' << cur.y << ' ' << cur.t << endl;
if(cur.x == finish.first && cur.y == finish.second) {
cout << cur.t << endl;
break;
}
if(isalpha(arr[cur.x][cur.y])) {
auto pos = getAnother(arr[cur.x][cur.y], {cur.x, cur.y});
cur.x = pos.first, cur.y = pos.second;
}
for(int i = 1; i <= 4; i++) {
int xx = cur.x + dx[i], yy = cur.y + dy[i];
if(xx < 1 || yy < 1 || xx > n || xx > m || vis[xx][yy] || arr[xx][yy] == '#') continue;
q.push({xx, yy, cur.t + 1});
}
}
system("pause");
return 0;
}
/*
5 5
##=##
...##
#A###
..#A.
.@###
*/
19 24
########################
#@..A.#BR#RF#E...#.....#
#...#.##.##.####.#.###.#
#####BA#.##.#Q.#.#.#...#
#D...C#W.#FQ####...#.#.#
####C########D.E####.#.#
#...#...#....#W#...#.#.#
#.#.#.#.#.#...#..#.#.#.#
#.#...#...#..T#..#...#.#
#N##############.#####.#
#X#X#M#J#V###V.#.......#
#Z#Y#Y#M#J#########.####
#..#.#.#.##......#.....#
#.#...N#....#...#......#
#.#.####.####..#.......#
#.#......#....#........#
#.########.###.......###
#....................#T=
########################
初步DEBUG发现bfs在枚举(16,8,77)和(11,10,78)时和luogu不一样
求调!!!