#include<iostream>
#include<queue>
using namespace std;
const int N = 350;
struct Pos {
int x, y;
int dis; //将距离定义到结构体队列中
};
const int dx[4] = { 0,1,0,-1 };
const int dy[4] = { 1,0,-1,0 };
bool vis[N][N];
char g[N][N];
int n, m;
queue<Pos>q;
int ans;
void transport(int &x,int &y) { //单独将传送写成一个函数
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (g[i][j] == g[x][y] && (i != x || j != y)) { //寻找与当前传送门匹配的传送门,且搜到的相同字母不能是和当前点相同
x = i;
y = j;
return;
}
}
}
}
int bfs(int ix, int iy) {
q.push({ ix,iy ,0});
vis[ix][iy] = true;
while (q.size()) {
auto t = q.front();
q.pop();
if (g[t.x][t.y] == '=') { //如果已经走到了终点,那么就直接返回这个点的距离
return t.dis;
}
if (g[t.x][t.y] >= 'A' && g[t.x][t.y] <= 'Z') { //如果这个点是传送门
transport(t.x, t.y);
}
for (int i = 0; i < 4; i++) {
int xx = t.x + dx[i], yy = t.y + dy[i];
if (xx >= 1 && xx <= n && yy >= 1 && yy <= m && vis[xx][yy] == false && g[xx][yy] != '#') {
vis[xx][yy] = true;
q.push({ xx,yy,t.dis + 1 });
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> g[i][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (g[i][j] == '@') { //找到起点
ans = bfs(i, j);
break;
}
}
}
cout << ans;
return 0;
}
洛谷 P1825 [USACO11OPEN] Corn Maze S
于 2023-12-27 22:31:18 首次发布