知识点:搜索,模拟
这个题一开始拿到,想到了小学看哆啦A梦,剧场版,大雄被困在一个地下迷宫里面,然后靠着一个专门找迷宫的道具出去了,就是一直贴着墙边走,这样总能出去的,这个题也是这样的,
题目让求3个数,前两个是一样的方法,第三个太简单了就不说了,就说第一个,这里我们显然要用到方向,也就是状态是横纵坐标以及方向,至少我是这么写的,然后这里的本质就是一条链,遍历一条链,当然链上可能有写点多次走过,但是,就像前面说的这样走总能走到终点,所以使用一个while循环就行了,感觉这才是这个题的本质,不是什么树形或者更复杂的结构,使用DFS当然可以,但是这样就简单问题复杂化了,使用一个while循环,一定能走到终点,剩下的就是带方向的模拟了,考验这类模拟的基本功,就不说了
#include <bits/stdc++.h>
using namespace std;
const int N = 45;
struct node {
int x, y;
node() {}
node(int a, int b): x(a), y(b) {}
};
int n, m, xs, ys, xe, ye;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
char s[N][N];
int main() {
int T;
cin >> T;
while (T--) {
cin >> m >> n;
for (int i = 1; i <= n; i++) {
scanf("%s", s[i] + 1);
for (int j = 1; j <= m; j++) {
if (s[i][j] == 'S') { xs = i; ys = j; }
if (s[i][j] == 'E') { xe = i; ye = j; }
}
}
int dir, ans1 = 0, ans2 = 0;
if (xs == 1) dir = 1;
if (xs == n) dir = 3;
if (ys == 1) dir = 0;
if (ys == n) dir = 2;
int x = xs, y = ys;
while (!(x == xe && y == ye)) {
for (int i = -1; i <= 2; i++) {
int dir1 = (dir + i + 4) % 4;
int x1 = x + dx[dir1];
int y1 = y + dy[dir1];
if (x1 < 1 || x1 > n || y1 < 1 || y1 > m) continue;
if (s[x1][y1] == '#') continue;
x = x1; y = y1; dir = dir1;
break;
}
ans1++;
}
if (xs == 1) dir = 3;
if (xs == n) dir = 1;
if (ys == 1) dir = 2;
if (ys == n) dir = 0;
x = xs; y = ys;
while (!(x == xe && y == ye)) {
for (int i = 1; i >= -2; i--) {
int dir1 = (dir + i + 4) % 4;
int x1 = x + dx[dir1];
int y1 = y + dy[dir1];
if (x1 < 1 || x1 > n || y1 < 1 || y1 > m) continue;
if (s[x1][y1] == '#') continue;
x = x1; y = y1; dir = dir1;
break;
}
ans2++;
}
queue<node> q;
q.push(node(xs, ys));
int dist[N][N];
memset(dist, -1, sizeof(dist));
dist[xs][ys] = 0;
while (!q.empty()) {
node now = q.front(); q.pop();
if (now.x == xe && now.y == ye) break;
for (int i = 0; i < 4; i++) {
int x1 = now.x + dx[i];
int y1 = now.y + dy[i];
if (x1 < 1 || x1 > n || y1 < 1 || y1 > m) continue;
if (s[x1][y1] == '#' || dist[x1][y1] != -1) continue;
q.push(node(x1, y1));
dist[x1][y1] = dist[now.x][now.y] + 1;
}
}
cout << ans1 + 1 << ' ' << ans2 + 1 << ' ' << dist[xe][ye] + 1 << '\n';
}
return 0;
}