Dungeon Master(bfs)

Dungeon Master

题目传送门

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值