2016计算机学科夏令营上机考试F:Dungeon Master(搜索——六方向BFS)

在这里插入图片描述
在这里插入图片描述

题目大意

三维空间的迷宫问题,要求从S搜索到E,“.”为可行进路线,“*”为不可行进路线,搜索方向为前后左右上下六个方向。

思路分析

三维空间的迷宫问题,解题思路与方法与二维空间一致。利用三维数组存储地图,采用BFS搜索,向6个方向遍历即可。

注意点:

因为矩阵中存储的是字符,所以如果用scanf进行输入时要用getchar对上次输入的回车符进行吸收。但是用getchar吸收回车,如果没计算地很精准,容易导致存储矩阵存储错误。因而对于字符存储,建议使用cin。

代码

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;

struct node
{
    int z, x, y;
    int layer;
}Start, End;

const int maxn = 35;
char map[maxn][maxn][maxn];
bool vis[maxn][maxn][maxn] = {false};
int dz[6] = {0, 0, 0, 0, 1, -1};
int dx[6] = {0, 0, 1, -1, 0, 0};
int dy[6] = {1, -1, 0, 0, 0, 0}; 

int L, R, C;

void init()
{
    fill(map[0][0], map[0][0]+maxn*maxn*maxn, '#');
    fill(vis[0][0], vis[0][0]+maxn*maxn*maxn, false);
}

bool judge(int z, int x, int y)
{
    if(z<0 || z>=L || x<0 || x>=R || y<0 || y>=C)
    {
        return false;
    }
    if(vis[z][x][y]==true || map[z][x][y]=='#')
    {
        return false;
    }
    return true;
}

int BFS()
{
    queue<node> q;
    q.push(Start);
    while(!q.empty())
    {
        node front = q.front();
        q.pop();
        if(front.z==End.z && front.x==End.x && front.y==End.y)
        {
            return front.layer; // 到达终点
        }
        for(int i=0; i<6; i++)
        {
            int zz = front.z + dz[i];
            int xx = front.x + dx[i];
            int yy = front.y + dy[i];
            if(judge(zz, xx, yy) == true)
            {
                node temp;
                temp.z = zz;
                temp.x = xx;
                temp.y = yy;
                temp.layer = front.layer + 1;
                q.push(temp);
                vis[zz][xx][yy] = true;
            }
        }
    }
    return -1; // 无法到达终点
}

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

int main()
{
    //freopen("input.txt", "r", stdin);
    while(cin >> L >> R >> C)
    {
        if(L==0 && R==0 && C==0)
        {
            break;
        }
        init();
        for(int z=0; z<L; z++)
        {
            //getchar();
            for(int x=0; x<R; x++)
            {
                //getchar();
                for(int y=0; y<C; y++)
                {
                    char item;
                    cin >> item;
                    map[z][x][y] = item;
                    if(item == 'S')
                    {
                        Start.z = z;
                        Start.x = x;
                        Start.y = y;
                        Start.layer = 0;
                    }
                    if(item == 'E')
                    {
                        End.z = z;
                        End.x = x;
                        End.y = y;
                    }
                }
            }
        }
        int ans = BFS();
        print(ans);
    }
    //fclose(stdin);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值