题目描述
一开始以为是2维的题 就写的2维的偏移 wa了好久 wuuwuw
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 10010;
int n,m,k;
char s[N][110]; // 存储字符
PII start;
PII en;
int d[N][110]; //dist距离
void bfs(){
queue<PII> q;
q.push(start);
//移动层 在数据存储方面可以看成 +n 行 和 -n 行
int dx[6]={-1,0,1,0,n,-n}; //偏移量数组
int dy[6]={0,1,0,-1,0,0};
while(q.size()){
auto t = q.front();
q.pop();
//搜索到终点直接退出
if(s[t.x][t.y] == 'E') return;
for(int i = 0 ; i <= 5 ; i++){
if(i == 0 && t.x % n == 1) continue; //如果当前点在某一层的第一行的话 移动到0行是不合法的
if(i == 2 && t.x % n == 0) continue; //如果当前点在某一层的第n行的话 移动到 n+行是不合法的
int a = t.x + dx[i];
int b = t.y + dy[i];
if(a <= 0 || a > n * k || b <= 0 || b > m || s[a][b] == '#' || d[a][b]) continue;
d[a][b] = d[t.x][t.y] + 1;
q.push({a,b});
}
}
}
int main()
{
while(cin >> k >> n >> m && n && k && m){
for(int i = 0 ; i < k ; i++)
for(int j = 1 ; j <= n ; j++)
for(int c = 1 ; c <= m ; c++){
cin >> s[i * n + j][c];
d[i * n + j][c] = 0; // 初始化数组
//记录起点和终点
if(s[i * n + j][c] == 'S') start = {i * n + j,c};
if(s[i * n + j][c] == 'E') en = {i * n + j,c};
}
bfs();
if(d[en.x][en.y]) printf("Escaped in %d minute(s).\n",d[en.x][en.y]);
else puts("Trapped!");
}
return 0;
}