bfs练习题


/*
Description - 题目描述
[NWUACM] 
你被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成
你每次向上下前后左右移动一个单位需要一分钟
你不能对角线移动并且四周封闭
是否存在逃出生天的可能性?如果存在,则需要多少时间?

Input - 输入
  输入第一行是一个数表示空间的数量。
  每个空间的描述的第一行为L,R和C(皆不超过30)。
  L表示空间的高度。
  R和C分别表示每层空间的行与列的大小。
  随后L层地牢,每层R行,每行C个字符。
  每个字符表示空间的一个单元。'#'表示不可通过单元,'.'表示空白单元。你的起始位置在'S',出口为'E'。
  每层空间后都有一个空行。L,R和C均为0时输入结束。

Output - 输出
  每个空间对应一行输出。

  如果可以逃生,则输出如下

Escaped in x minute(s).

  x为最短脱离时间。

  如果无法逃生,则输出如下

Trapped!

Sample Input - 输入样例
3 4 5
S....
.###.
.##..
###.#

#####
#####
##.##
##...

#####
#####
#.###
####E

扫描二维码关注公众号,回复: 2538315 查看本文章

1 3 3
S##
#E#
###

0 0 0
Sample Output - 输出样例
Escaped in 11 minute(s).
Trapped!
*/ 

/*
本题只是 把 二维的图  变成 三维的 立体图啦;
只要在方法上  改变  一下 就能编出来了 

*/
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int l,n,m;
struct stuts{
    int x,y,z;
    int step;
    friend bool operator < (stuts a,stuts b)
    {
        return a.step>b.step;
    }
}aa,bb;
int vis[50][50][50];
int b[6][3] ={1,0,0,0,1,0,0,0,1,0,0,-1,-1,0,0,0,-1,0};
char ss[50][50][50];
void bfs(int x1,int y1,int z1)
{
    memset(vis,0,sizeof(vis));
    aa.x = x1;aa.y = y1;aa.z = z1;aa.step =0;
    vis[x1][y1][z1] = 1;
    priority_queue<stuts>ww;
    ww.push(aa);
    int steps = -1;
    while(!ww.empty())
    {
        aa = ww.top();
        ww.pop();
        if(ss[aa.x][aa.y][aa.z]=='E')
        {
            steps = aa.step;
            break;
        }
        for(int i=0;i<6;i++)
        {
            bb.x = aa.x+b[i][0];
            bb.y = aa.y+b[i][1];
            bb.z = aa.z+b[i][2];
            if(bb.x>=l||bb.y>=n||bb.z>=m||bb.x<0||bb.y<0||bb.z<0)  continue;
            if(vis[bb.x][bb.y][bb.z]==1)    continue;
            if(ss[bb.x][bb.y][bb.z]=='#')    continue;
            if(ss[bb.x][bb.y][bb.z]=='.'||ss[bb.x][bb.y][bb.z]=='E')
            {
                bb.step = aa.step+1;
            }
            vis[bb.x][bb.y][bb.z] =1;
            ww.push(bb);
        }
    }
    if(steps>0)
    printf("Escaped in %d minute(s).\n",steps);
    else
    printf("Trapped!\n");
}
int main()
{
    int x1,y1,z1;
    while(scanf("%d%d%d",&l,&n,&m)&&(l||n||m))
    {
        for(int i=0;i<l;i++)
        for(int j=0;j<n;j++)
        scanf("%s",ss[i][j]);
        for(int i=0;i<l;i++)
        for(int j=0;j<n;j++)
        for(int k=0;k<m;k++)
        if(ss[i][j][k]=='S')
        {
            x1 = i;
            y1 = j;
            z1 = k;
        }
        bfs(x1,y1,z1);
    }
}

猜你喜欢

转载自blog.csdn.net/lijianzhong1/article/details/81320109