poj2251(简单搜索)

三维简单搜索

结果为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;
        }

    }






}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
POJ2251是一个经典的题目,也被称为"水仙花的谜题"。该题目要求在一个三维的迷宫中找到从起点到终点的最短路径。 在这个题目中,迷宫由一个3D的数组表示,每个位置上的值代表了该位置的状态。其中,0表示可以通过的路径,1表示墙壁,2表示起点,3表示终点。你需要编写一个程序来找到从起点到终点的最短路径,并输出路径的长度。 解决这个问题的一种常见方法是使用广度优先搜索(BFS)算法。BFS算法可以从起点开始,逐层遍历迷宫中的位置,直到找到终点或者遍历完所有可达位置。在遍历过程中,你需要记录每个位置的距离和路径信息,以便找到最短路径。 以下是解决该问题的大致思路: 1. 定义一个队列,将起点加入队列,并标记起点已访问。 2. 使用循环来遍历队列中的元素,直到队列为空。 3. 在循环中,取出队列中的元素,并获取其相邻可达位置。 4. 对于每个相邻位置,判断是否为终点,如果是则输出最短路径长度并结束程序。 5. 如果不是终点,则判断该位置是否为可通过的路径,并且未被访问过。如果满足条件,则将该位置加入队列,并更新距离和路径信息。 6. 重复步骤2-5,直到找到终点或者遍历完所有可达位置。 这只是一个简单的介绍,实际解决该问题还需要考虑一些细节,比如如何表示迷宫、如何判断位置的合法性等。你可以在编写代码时参考相关的算法和数据结构知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值