【代码超详解】信息学奥赛一本通 1252 走迷宫(BFS 求最短路,6 ms)

本文详细介绍了如何使用BFS算法解决信息学奥赛中的迷宫问题,从题目描述到输入输出解析,再到算法分析和AC代码实现,帮助读者理解并掌握这一经典问题的解题思路。

一、题目描述

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 6040 通过数: 2707(2019/10/29)

【题目描述】

一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。

给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。

【输入】

第一行是两个整数,R和C,代表迷宫的长和宽。( 1≤ R,C ≤ 40)

接下来是R行,每行C个字符,代表整个迷宫。

空地格子用‘.’表示,有障碍物的格子用‘#’表示。

迷宫左上角和右下角都是‘.’。

【输出】

输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。

【输入样例】

5 5
…###
#…
#.#.#
#.#.#
#.#…

【输出样例】

9

【来源】

No

二、算法分析说明与代码编写指导

BFS求最短路
1、用途:对无权图或矩阵样式的块求最短路径(每步长度相同)。
2、算法内容:
设队列q。先将起点入队,然后以下部分循环直到队列为空,然后输出:
取q的队首,弹出。然后将q周围全部的可走的点都入队。入队的全部点都要标记已访问,以免死循环。
当队列为空,如果不在终点,则起点到终点无通路;否则,找到了一条最短路径。

3、补充说明:
【1】如果需要输出最短路径需要经过的步数(长度),应该用额外的数组存储已走的步数。
当取队首的某一点后,将周围的可行点入队时,对应位置的步数是取到的点的步数+1========================================================================================
一开始写的时候没注意,忘记判断点已经访问,然后就死循环,队列长炸了,不停 MLE + RE。
然后我就把数据类型全部改成字节数少的,结果没屁用。找 AC 代码去对才发现问题的。
迷宫最大 4040 列,在该情况下要给周围一圈留下位置,不然 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值