POJ 2251 B - Dungeon Master——双广度优先搜索

题意:在一个三维空间中寻找起止点之间的最短路,每次可以朝着同一个平面的前后左右走,或者到上一个平面或下一个平面与当前平面相同的位置。

思路:bfs暴一遍超时,考虑双向bfs

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

const int dx[] = {0, 0, -1, 1};
const int dy[] = {1, -1, 0, 0};
int l, r, c, ans, vis[50][50][50], visr[50][50][50];
struct Graph
{
    char g[50][50];
}G[50];
struct Point
{
    int x, y, z;
}st, ed;
struct State
{
    int x, y,z, step;
}state, temp;

void bfs()
{
    ans = -1;
    memset(vis, 0, sizeof(vis));
    memset(visr, 0, sizeof(visr));
    queue<State> q;
    queue<State> qr;
    state.x = st.x, state.y = st.y, state.z = st.z, state.step = 0;
    vis[st.x][st.y][st.z] = 1;
    q.push(state);
    state.x = ed.x, state.y = ed.y, state.z = ed.z, state.step = 0;
    visr[ed.x][ed.y][ed.z] = 1;
    qr.push(state);

    int STEP = 0, STEPR = 0;
    while (!q.empty() || !qr.empty())
    {
        while (!q.empty() && q.front().step <= STEP)
        {
            temp = q.front();
            q.pop();
            int x = temp.x, y = temp.y, z = temp.z, step = temp.step;
            int STEP = step;

            if (visr[x][y][z])
            {
                ans = STEP + STEPR;
                return;
            }

            for (int i = 0; i < 4; i++)
            {
                int xx = x + dx[i], yy = y + dy[i];
                if (0 <= xx && xx < r && 0 <= yy && yy < c && !vis[xx][yy][z] && G[z].g[xx][yy] != '#')
                {
                    vis[xx][yy][z] = 1;
                    state.x = xx, state.y = yy, state.z = z, state.step = step + 1;
                    q.push(state);
                }
            }
            if (z + 1 < l && !vis[x][y][z + 1] && G[z + 1].g[x][y] != '#')
            {
                vis[x][y][z + 1] = 1;
                state.x = x, state.y = y, state.z = z + 1;
                state.step = step + 1;
                q.push(state);
            }
            if (z - 1 >= 0 && !vis[x][y][z - 1] && G[z - 1].g[x][y] != '#')
            {
                vis[x][y][z - 1] = 1;
                state.x = x, state.y = y, state.z = z - 1;
                state.step = step + 1;
                q.push(state);
            }
        }
        if (!q.empty()) STEP++;
        /*---------------------------------------------------------------*/
        while (!qr.empty() && qr.front().step <= STEPR)
        {
            temp = qr.front();
            qr.pop();
            int x = temp.x, y = temp.y, z = temp.z, step = temp.step;

            if (vis[x][y][z])
            {
                ans = STEP + STEPR;
                return;
            }

            for (int i = 0; i < 4; i++)
            {
                int xx = x + dx[i], yy = y + dy[i];
                if (0 <= xx && xx < r && 0 <= yy && yy < c && !visr[xx][yy][z] && G[z].g[xx][yy] != '#')
                {
                    visr[xx][yy][z] = 1;
                    state.x = xx, state.y = yy, state.z = z, state.step = step + 1;
                    qr.push(state);
                }
            }
            if (z + 1 < l && !visr[x][y][z + 1] && G[z + 1].g[x][y] != '#')
            {
                visr[x][y][z + 1] = 1;
                state.x = x, state.y = y, state.z = z + 1;
                state.step = step + 1;
                qr.push(state);
            }
            if (z - 1 >= 0 && !visr[x][y][z - 1] && G[z - 1].g[x][y] != '#')
            {
                visr[x][y][z - 1] = 1;
                state.x = x, state.y = y, state.z = z - 1;
                state.step = step + 1;
                qr.push(state);
            }
        }
        if (!qr.empty()) STEPR++;
    }
}

int main()
{
    while (scanf("%d %d %d", &l, &r, &c) == 3 && (l + r + c))
    {
        for (int i = 0; i < l; i++)
        {
            getchar();
            for (int j = 0; j < r; j++)
            {
                for (int k = 0; k < c; k++)
                {
                    G[i].g[j][k] = getchar();
                    if (G[i].g[j][k] == 'S')
                    {
                        st.z = i, st.x = j, st.y = k;
                    }
                    else if (G[i].g[j][k] == 'E')
                    {
                        ed.z = i, ed.x = j, ed.y = k;
                    }
                }
                getchar();
            }
        }
        bfs();
        if (ans == -1)
        {
            printf("Trapped!\n");
        }
        else
        {
            printf("Escaped in %d minute(s).\n", ans);
        }
    }
    return 0;
}


Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值