poj2251(简单搜索)

本文介绍了一种三维迷宫搜索算法,使用广度优先搜索(BFS)策略在三维空间中寻找从起点到终点的最短路径。算法通过队列实现节点的遍历,并利用结构体存储节点坐标和时间信息,同时采用标记数组避免重复访问同一位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三维简单搜索

结果为1时输出去掉s

//
// Created by xingchaoyue on 2019/5/10.
//

#include<iostream>
#include<cstdio>
#include<queue>
#include<string.h>
using namespace std;
int n,m,k;
char mp[50][50][50];
int stk,stn,stm;
int edk,edn,edm;
int ans = -1;
struct node{
    int i,j,h;
    int tim;
     node(int _i,int _j,int _h,int _tim):i(_i),j(_j),h(_h),tim(_tim){}

};
queue<node>q;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int vis[50][50][50];
void bfs(){
    vis[stk][stn][stm]=1;
    node temp(stk,stn,stm,0);
    q.push(temp);
    while(!q.empty()){
        node te = q.front();
        q.pop();
        int i = te.i;
        int j = te.j;
        int h = te.h;
        int tim = te.tim;
       // cout<<i<<":"<<j<<":"<<h<<":"<<tim<<endl;
        if(i==edk&&j==edn&&h==edm){
            ans = tim;
            break;
        }

        for(int i1 =0;i1<6;++i1){
            int xi,xj,xh;
            if(i1<=3){
                 xi = i;
                xj = j+dir[i1][0];
                 xh = h+dir[i1][1];
            }
            else if(i1==4){
                xi = i-1;
                 xj = j;
                xh = h;
            }
            else{
                xi = i+1;
                xj = j;
                xh = h;
            }

            if(xj<0||xj>=n||xh<0||xh>=m||xi<0||xi>=k)continue;

           // cout<<xi<<xj<<xh<<endl;
            //cout<<i1<<":"<<mp[xi][xj][xh]<<endl;
            if(mp[xi][xj][xh]!='#'&&!vis[xi][xj][xh]){
                vis[xi][xj][xh]=1;
                node te1(xi,xj,xh,tim+1);
                q.push(te1);
            }
        }





    }

    while(!q.empty())q.pop();

}
void out(){
    for(int i= 0;i<k;++i){
        for(int j = 0;j<n;++j){
            for(int h = 0;h<m;++h){
                cout<<mp[i][j][h];
            }
            cout<<endl;
        }
        cout<<endl;
    }
}
int main(){
    while(~scanf("%d%d%d",&k,&n,&m)&&n!=0){
        memset(vis,0,sizeof(vis));
        ans = -1;
        for(int i =0;i<k;++i){
            for(int j = 0;j<n;++j){
                scanf("%s",mp[i][j]);
            }
            getchar();
        }
        int cnt = 0;
        for(int i =0;i<k;++i){
            for(int j =0;j<n;++j){
                for(int h = 0;h<m;++h){
                    cnt++;
                    if(mp[i][j][h]=='S'){
                        stk = i;
                        stn = j;
                        stm = h;
                    }
                    if(mp[i][j][h]=='E'){
                        edk = i;
                        edn = j;
                        edm = h;
                    }
                }
            }
        }
        //out();
        //cout<<cnt<<endl;

        bfs();
        if(ans==-1){
            cout<<"Trapped!"<<endl;
        }
        else{
            if(ans==1){
                cout<<"Escaped in "<<ans<<" minute."<<endl;
            }
            else
            cout<<"Escaped in "<<ans<<" minute(s)."<<endl;
        }

    }






}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值