九度OJ 1456 胜利大逃亡(模拟+BFS)

工创赛智能搬运小车实战:视觉定位、底盘控制与RTOS调度 智能搬运系统是嵌入式控制与机器视觉融合的典型工程实践,其核心在于视觉定位精度、运动控制稳定性与实时任务调度能力。在有限算力(如STM32H7)、低功耗约束和结构化场景下,传统CV方法(如FAST+RANSAC)比轻量级深度学习更具鲁棒性与实时性;而底盘控制需穿透PID表层,直击死区补偿、编码器硬件滤波与负载自适应等物理层细节;RTOS则不是炫技工具,而是保障多模块时序确定性的刚需——尤其在视觉-控制-执行强耦合链路中,任务优先级、事件组通信与栈安全直接影响系统存活。本文聚焦全国大学生工程训练竞赛(工创赛)真 阅读详情

原题地址

http://ac.jobdu.com/problem.php?pid=1456

给定一个三维迷宫,求从入口到出口的最短路径。

解题思路

本题的题意很容易懂,因为刚刚写了几道DFS,所以很自然就用DFS去做这道题,可是不管怎么剪枝都1000ms+超时,改用BFS马上就用30ms AC了,可见两者在耗时上的差别实在是大。

详见大神总结的[BFS和DFS区别](http://blog.youkuaiyun.com/u013551536/article/details/50926922)

  • BFS是按一层一层来访问的,优先访问的是兄弟节点,只有这一层全部访问完才能访问下一层,也就是说BFS第几层就代表以当前代价可以走到的位置(结点),适合用来搜索最短路径长度、最少费用问题!

  • DFS是按递归来实现的,它优先搜索深度,再回溯,优先访问的是没有访问过的子节点,求得的路径可能不是最短路径(但是可以打印路径),适合用来搜索能否到达目的地、连通性问题!

用三维数组模拟迷宫,用二维数组表示每个点相邻的六个方向(上下左右前后),然后用队列模拟BFS的过程,实现思路比较清晰。

AC代码

成功的BFS:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
typedef struct node
{
    int x, y, z;
    int step;
    node(int x1, int y1, int z1, int step1) //初始化赋值
    {
        x = x1, y = y1, z = z1;
        step = step1;
    }
}NODE;

const int maxn = 55;
int puzzle[maxn][maxn][maxn];
bool visited[maxn][maxn][maxn]; //标记某个点是否被访问过
int A, B, C, limit;

int dir[6][3] =
{
    -1, 0, 0, //up
    1, 0, 0, //down
    0, 0, -1, //left
    0, 0, 1, //right
    0, -1, 0, //back
    0, 1, 0 //front
};

int bfs()
{
    queue<NODE> Q;
    NODE p(0,0,0,0); //初始结点入队
    Q.push(p);
    visited[0][0][0] = true;
    while (!Q.empty()) //队列不空
    {
        NODE q = Q.front();
        Q.pop();
        if (q.x == A-1 && q.y == B-1 && q.z == C-1 && q.step <= limit) //找到满足条件的最短路
            return q.step;
        for (int i = 0; i<6; ++i) //对六个方向分别生成新节点
        {
            NODE next(q.x+dir[i][0], q.y+dir[i][1], q.z+dir[i][2], q.step+1);
            if (!visited[next.x][next.y][next.z] //没被访问过
                && 0 <= next.x && next.x < A
                && 0 <= next.y && next.y < B
                && 0 <= next.z && next.z < C
                && puzzle[next.x][next.y][next.z] == 0)
            {
                visited[next.x][next.y][next.z] = true; //标记新节点被访问过
                Q.push(next);
            }
        }
    }
    return -1;
}

int main()
{
    ios::sync_with_stdio(false);
    int kase;
    cin >> kase;
    while(kase--)
    {
        cin >> A >> B >> C >> limit;
        memset(visited, 0, sizeof(visited));
        for (int i = 0; i<A; ++i)
            for (int j = 0; j<B; ++j)
                for (int k = 0; k<C; ++k)
                    cin >> puzzle[i][j][k];
        int ans = bfs();
        cout << ans << endl;
    }
    return 0;
}

失败的DFS:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
using namespace std;

const int maxn = 55;
int puzzle[maxn][maxn][maxn];
bool visited[maxn][maxn][maxn];
int A, B, C, limit, minT;

int dir[6][3] =
{
    -1, 0, 0, 
    1, 0, 0, 
    0, 0, -1, 
    0, 0, 1, 
    0, -1, 0,
    0, 1, 0
};

void dfs(int x, int y, int z, int cnt)
{
    if (cnt > limit) return;
    if (x == A-1 && y == B-1 && z == C-1)
    {
        minT = min(minT, cnt);
        return;
    }
    int nx,ny,nz;
    for (int mov = 0; mov < 6; ++mov)
    {
        nx = x + dir[mov][0];
        if (nx < 0 || nx >= A) continue;
        ny = y + dir[mov][1];
        if (ny < 0 || ny >= B) continue;
        nz = z + dir[mov][2];
        if (nz < 0 || nz >= C) continue;
        if (!visited[nx][ny][nz] && puzzle[nx][ny][nz] == 0)
        {
            visited[nx][ny][nz] = true;
            dfs(nx, ny, nz, cnt+1);
            visited[nx][ny][nz] = false;
        }
    }
}

void solve()
{
    if (puzzle[0][0][0] == 1)
    {
        cout << -1 << endl;
        return;
    }
    visited[0][0][0] = true;
    dfs(0, 0, 0, 0);
    if(minT <= limit)
        cout << minT << endl;
    else cout << -1 << endl;
}

int main()
{
    ios::sync_with_stdio(false);
    int kase;
    cin >> kase;
    while(kase--)
    {
        cin >> A >> B >> C >> limit;
        minT = 5000;
        memset(visited, 0, sizeof(visited));
        for (int i = 0; i<A; ++i)
            for (int j = 0; j<B; ++j)
                for (int k = 0; k<C; ++k)
                    cin >> puzzle[i][j][k];
        solve();
    }
    return 0;
}
避免踩坑!杰理AC63蓝牙名修改常见问题及解决方案(含BLE后缀处理) 本文详细解析了杰理AC63蓝牙设备名称修改的全过程,包括基础操作、BLE后缀处理及高级调试技巧。针对蓝牙名修改中的常见问题,提供了实用的解决方案和代码示例,帮助开发者避免踩坑并实现高效定制。 阅读详情

相关推荐

【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)

【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)

weixin_57514792的博客 1105

XTU-OJ 1456-分类

比如,有4个队员能力值为5,7,6,6,将其分成2个团队。如果{5,6}为一队,{6,7}为另一队,那么能力差值最大值为1;如果{5,7}一队,{6.6},那么能力差值最大值为2。上述例子中,能力差值最大值的最小为1。n个队员,编号为1∼n,第i号人的能力值为ai,现在你想把这些人分成m个团队。每个样例的第一行是两个整数n(2≤n≤10000), m(2≤m≤n),表示队员数。第二行是n整数ai, (1≤ai≤109),表示队员的能力值。第一行是一个整数T(1≤T≤100),表示样例的个数。

Jay_is_Chou的博客 969

Qt绘图实战:用QGraphicsItem实现可拖拽箭头连接(附完整代码)

本文详细介绍了如何使用Qt的QGraphicsItem框架实现一个功能完备的可拖拽箭头连接组件。通过核心代码示例,讲解了如何创建自定义图形项、实现智能吸附、碰撞检测以及实时拖拽编辑路径,为构建流程图、拓扑图等专业图形编辑器提供了完整的解决方案。

m2n3b4v5c6的博客 626

力扣OJ(1401-1500)

目录 1414. 和为 K 的最少斐波那契数字数目 1420. 生成数组 1424. 对角线遍历 II 1461. 检查一个字符串是否包含所有长度为 K 的二进制子串 1496. 判断路径是否相交 1502. 判断能否形成等差数列 1503. 所有蚂蚁掉下来前的最后一刻 1504. 统计全 1 子矩形 1414. 和为 K 的最少斐波那契数字数目 给你数字 k,请你返回和为k的斐波那契数字的最少数目,其中,每个斐波那契数字都可以被使用多次。 斐波那契数字定义为: F1 ...

nameofcsdn的博客 3864

深入解析Carry4的内部结构与工作原理

本文深入解析了Xilinx/AMD FPGA中的核心硬件资源Carry4的内部结构和工作原理。作为实现超前进位的关键物理电路,Carry4通过其CI、DI、S、O、CO等端口,高效处理4位算术运算的进位逻辑。文章通过端口详解、结构分析和实战计算示例,揭示了其如何加速加法、减法等运算,并探讨了其在优化FPGA设计时序与资源利用中的关键作用。

n4o5p6q7r的博客 502

centos7安装Ambari 2.7.5 + HDP3.1.5

准备 1.安装包准备: Ambari2.7.5、HDP31.5、libtirpc-devel: centos7操作系统: 链接:https://pan.baidu.com/s/1vzvio5rAMsbYF0-0vBs5dw 提取码:xij9

kxq的博客 5091

胜利大逃亡

题目描述:Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计...

weixin_34405925的博客 225

【小程序抓取】解决痛点:如何用 AI-RPA 工具抓取无法获取 URL 的微信小程序数据?

本文探讨了传统爬虫技术在微信小程序数据采集中的局限性,并提出了AI-RPA(人工智能驱动的机器人流程自动化)这一前沿解决方案。随着微信小程序安全防护体系的全面升级(包括证书锁定、加密传输和三级防御机制),传统"抓包-模拟请求"的方式已基本失效。文章对比了Reqable、Fiddler等主流抓包工具的优劣,通过某程旅行小程序案例展示了传统抓包的技术流程和动态参数处理的难点。最终指出,2026年最有效的解决方案是采用AI-RPA技术,通过视觉识别、鼠标键盘模拟、OCR和AI智能体编排的组合方案,直接从小程序UI

ZDQ58818的博客 124

九度OJ题目1456:胜利大逃亡(BFS算法)

题目描述: Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图

风口的猪2016 736

[毕设项目-大模型微调]现代文翻译文言文【基于LLaMA3.1-8B微调】

教你基于LLaMA3.1-8B微调如何做到现代文翻译文言文

逐梦苍穹的博客 2296

YOLOv8与注意力机制融合:EMA(高效多维注意力)的原理剖析与实战应用

本文介绍了如何在YOLOv8目标检测模型中集成EMA(高效多尺度注意力)机制。主要内容包括:EMA注意力机制的工作原理解析,展示其多尺度特征融合和高效计算特性;详细的环境配置与依赖安装指南;EMA模块的完整代码实现,包含分组处理、空间注意力权重计算和特征融合等关键步骤;以及将EMA集成到YOLOv8网络结构的方法。通过添加EMA模块,可以提升模型对关键特征的关注能力,有效抑制背景干扰,从而增强目标检测性能。本教程提供了从原理到实现的完整解决方案。

m0_64661770的博客 147

胜利大逃亡 (九度 OJ 1456)

胜利大逃亡 (九度 OJ 1456) 时间限制:2 秒 内存限制:32 兆 特殊判题:否 1.题目描述: Ignatius 被魔王抓走了,有一天魔王出差去了,这可是 Ignatius 逃亡的好机会. 魔王住在一个城堡里,城堡是一个 ABC 的立方体,可以被表示成 A 个 B*C 的矩 阵,刚开始 Ignatius 被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现 在...

qq_37053885的博客 555

60、新型共轴直升机建模与事件触发积分强化学习研究

本文研究了新型共轴直升机的动力学建模与控制方法,基于牛顿-欧拉方程建立了6自由度非线性模型,并设计了四通道闭环控制器实现稳定飞行。同时,提出一种事件触发积分强化学习方法,用于解决非零和博弈中的最优跟踪控制问题,在减少通信开销的同时保证系统性能。通过仿真验证了控制器的轨迹跟踪能力,并证明了算法下跟踪误差与神经网络权重估计误差的一致最终有界性。两种方法协同可提升飞行器的自主性与鲁棒性,未来可拓展至多智能体协作、智能交通等复杂系统应用。

rl6adventurer的博客 118

hdu 1253 胜利大逃亡(简单题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 题目大意:在所给的时间能顺利离开城堡。   1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 int map[55][55][55],visit[55][55][55]

若忆_star 599

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

九度oj 1449

题目描述: 有N个比赛队(1 输入: 输入有若干组,每组中的第一行为二个数N(1 输出: 给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。 其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。 样例输入: 4 3 1 2 2 3 4 3

lifestylegoingon的专栏 644

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

胜利大逃亡(九度OJ 1456)(BFS搜索)

#include<stdio.h> #include<queue> using namespace std; bool mark[50][50][50]; int maze[50][50][50]; int walknext[][3] = { 1,0,0, -1,0,0, 0,1,0, 0,-1,0, 0,0,1, 0,0,-1 }; struct point ...

okkil的博客 201

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JOBDU-OJ 1456 胜利大逃亡

题目描述: Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你

郑在翔的博客 670

HDOJ 1253 HDU 1253 胜利大逃亡 ACM 1253 IN HDU

MiYu原创, 转帖请注明 : 转载自______________白白の屋题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1253题目描述:胜利大逃亡Time Limit: 4000/2000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total...

weixin_30357231的博客 494

胜利大逃亡 - 九度 OJ 1456

胜利大逃亡 - 九度 OJ 1456 题目 时间限制:2 秒 内存限制:32 兆 特殊判题:否 题目描述: Ignatius 被魔王抓走了,有一天魔王出差去了,这可是 Ignatius 逃亡的好机会.魔王住在一个城堡里,城堡是一个 ABC 的立方体,可以被表示成 A 个 B*C 的矩阵,刚开始 Ignatius 被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道...

Yoc Lu 342

HDU-OJ-1429 胜利大逃亡(续)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安

JSure的代码库 1135

hdu 1253

胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 38741    Accepted Submission(s): 13628 Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignat

sxh759151483的博客 221

九度OJ 1156 谁是你的潜在朋友(哈希+计数)

原题地址:http://ac.jobdu.com/problem.php?pid=1156 题目描述:     “臭味相投”——这是我们描述朋友时喜欢用的词汇。两个人是朋友通常意味着他们存在着许多共同的兴趣。然而作为一个宅男,你发现自己与他人相互了解的机会并不太多。幸运的是,你意外得到了一份北大图书馆的图书借阅记录,于是你挑灯熬夜地编程,想从中发现潜在的朋友。     首先你对借阅记

Lecholin的博客 894

九度OJ 1101 表达式求值(栈的应用)

原题地址:http://ac.jobdu.com/problem.php?pid=1101 题目描述: 对于一个不存在括号的表达式进行计算 输入: 存在多种数据,每组数据一行,表达式不存在空格 输出: 输出结果 样例输入: 6/2+3+3*4 样例输出: 18 来源: 2010年上海交通大学计算机研究生机试真题

Lecholin的博客 849

九度OJ 1061 成绩排序(结构体排序)

原题地址:http://ac.jobdu.com/problem.php?pid=1061 题目描述:     有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。 输入:     测试数据有多组,每组输入第一行有一个整数N(N     每个学生的数据包括姓名(长度不

Lecholin的博客 795

九度OJ 1019 简单计算器(栈的应用)

原题地址:http://ac.jobdu.com/problem.php?pid=1019 题目描述:     读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 输入:     测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

Lecholin的博客 775

九度OJ 1153 括号匹配问题(栈的应用)

原题地址:http://ac.jobdu.com/problem.php?pid=1153 题目描述:     在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配

Lecholin的博客 689
上一篇: POJ 2386 Lake Counting(深度优先搜索)
下一篇: POJ 3617 Best Cow Line(贪心+最小字典序)
youth.lin
博客等级 码龄12年 41粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值