这段时间要沉迷刷题一段时间了,就让CSDN陪我一起吧!
一、题目大意
这道题目的意思是在一个地牢里走迷宫,地牢一共L层,每一层都用一个R×C的矩阵来表示,其中’#‘表示墙,’.‘表示空地,‘S’表示开始的地方,‘E’表示结束的地方。要求是否可以从’S’走到’E’,如果不可以则输出’Trapped!’,否则输出’Escaped in x minute(s).’,其中x是能出来的最短时间(步数)。
二、题目思路以及AC代码
这道题就没有什么特别的,无非是将bfs稍微变了一下而已,变成了在三维上移动,本质还是一样的。做法就还是bfs的做法。
但这里面有一个坑必须得说一下。就是输出的时候,Escaped in x minute(s). 这里不是要你根据x的值来变单复数,而是无论x取值为多少,这里都是括号s!!这里要注意,我因为这里有一次WA。
下面给出AC代码:
#include <iostream>
#include <queue>
#define MAXN 35
using namespace std;
struct Point {
int x, y, z;
int step;
};
int L, R, C;
Point start, finish;
// 可以走的方向
int dx[6] = { -1, 0, 1, 0, 0, 0 };
int dy[6] = { 0, 0, 0, -1, 0, 1 };
int dz[6] = { 0, -1, 0, 0, 1, 0 };
// 前两维是当前平面,后一维是层数
char map[MAXN][MAXN][MAXN];
bool vis[MAXN][MAXN][MAXN];
int bfs() {
for (int i = 0; i < MAXN; i++) {
for (int j = 0; j < MAXN; j++) {
for (int k = 0; k < MAXN; k++) {
vis[i][j][k] = false;
}
}
}
queue<Point> q;
q.push(start);
vis[start.x][start.y][start.z] = true;
while (!q.empty()) {
Point cur = q.front(); q.pop();
for (int i = 0; i < 6; i++) {
int nx = cur.x + dx[i];
int ny = cur.y + dy[i];
int nz = cur.z + dz[i];
if (nx < 0 || nx >= R || ny < 0 || ny >= C || nz < 0 || nz >= L) continue;
if (map[nx][ny][nz] == '#' || vis[nx][ny][nz]) continue;
if (nx == finish.x && ny == finish.y && nz == finish.z)
return cur.step + 1;
vis[nx][ny][nz] = true;
Point next;
next.x = nx;
next.y = ny;
next.z = nz;
next.step = cur.step + 1;
q.push(next);
}
}
return -1;
}
int main()
{
while (cin >> L >> R >> C) {
if (!L && !R && !C)
break;
for (int k = 0; k < L; k++) {
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
cin >> map[i][j][k];
if (map[i][j][k] == 'S') {
start.x = i;
start.y = j;
start.z = k;
}
if (map[i][j][k] == 'E') {
finish.x = i;
finish.y = j;
finish.z = k;
}
}
}
}
start.step = 0;
int ans = bfs();
if (ans == -1)
cout << "Trapped!" << endl;
else
cout << "Escaped in " << ans << " minute(s)." << endl;
}
return 0;
}
如果有问题,欢迎大家指正!!!