Dungeon Master
题目传送门
题目大意
zjm被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成。
zjm每次向上下前后左右移动一个单位需要一分钟,且zjm不能对角线移动。
空间的四周封闭。zjm的目标是走到空间的出口。
是否存在逃出生天的可能性?如果存在,则需要多少时间?
思路
相当于一个三维空间的bfs,直接写就行了
AC Code
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define endl '\n'
#define INF 0x3f3f3f3f
#define int long long
// #define TDS_ACM_LOCAL
const int N=39;
int l, r, c;
char s[N][N][N];
typedef struct node{
int x, y, z;
int sum;
}node;
int vis[N][N][N];
int dirx[]={1,0,-1,0,0,0};
int diry[]={0,1,0,-1,0,0};
int dirz[]={0,0,0,0,1,-1};
bool check(node now){
if(now.x>=0 && now.x<l && now.y>=0 && now.y<r && now.z>=0 &&now.z<c && s[now.x][now.y][now.z]!='#')
return true;
return false;
}
int bfs(node d){
queue<node>q;
q.push(d);
vis[d.x][d.y][d.z]=1;
node now; now.sum=0;
while(!q.empty()){
now=q.front(); q.pop();
if(s[now.x][now.y][now.z]=='E') return now.sum;
for(int i=0; i<6; i++){
node next;
next.x=now.x+dirx[i];
next.y=now.y+diry[i];
next.z=now.z+dirz[i];
if(!vis[next.x][next.y][next.z] && check(next)){
next.sum=now.sum+1;
vis[next.x][next.y][next.z]=1;
q.push(next);
}
}
}
return -1;
}
void solve(){
while(cin>>l>>r>>c && (l+r+c)){
node zd;
for(int i=0; i<l; i++)
for(int j=0; j<r; j++)
for(int k=0; k<c; k++){
cin>>s[i][j][k];
if(s[i][j][k]=='S') zd.x=i, zd.y=j, zd.z=k, zd.sum=0;
}
memset(vis, 0, sizeof(vis));
int t=bfs(zd);
if(t==-1) cout<<"Trapped!"<<endl;
else cout<<"Escaped in "<<t<<" minute(s)."<<endl;
}
return ;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
#ifdef TDS_ACM_LOCAL
freopen("D:\\VS code\\.vscode\\testall\\in.txt", "r", stdin);
freopen("D:\\VS code\\.vscode\\testall\\out.txt", "w", stdout);
#endif
solve();
return 0;
}