
50、【图】迷宫问题——BFS(C/C++版)
发布日期:2021-05-08 14:54:34
浏览次数:17
分类:精选文章
本文共 1595 字,大约阅读时间需要 5 分钟。
为了解决这个问题,我们需要找到从迷宫的左上角移动到右下角的最短路径。这个问题可以通过广度优先搜索(BFS)来解决,因为BFS能够保证找到最短路径。
方法思路
问题分析:迷宫由0和1组成,0表示可以走的路,1表示墙壁。起点是左上角 (0,0),终点是右下角 (n-1, m-1)。我们需要找到从起点到终点的最少移动次数。
算法选择:使用BFS来进行层序遍历。BFS确保第一次到达终点的路径就是最短路径。
数据结构:使用一个队列来处理当前层的所有位置,并使用一个距离数组记录每个位置到起点的最短距离。
步骤:
- 初始化距离数组,起点距离为0,其余为-1。
- 将起点加入队列。
- 从队列中取出当前位置,检查四个方向(上、下、左、右)。
- 对于每个方向,如果新的位置是可通行的且未被访问过,更新距离并将其加入队列。
- 当处理到终点时,返回距离。
解决代码
#includeint main() { int n, m; scanf("%d %d", &n, &m); int g[n][m]; for (int i = 0; i < n; ++i) { int row[m]; scanf("%d", row); for (int j = 0; j < m; ++j) { g[i][j] = row[j]; } } int d[n][m]; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { d[i][j] = -1; } } d[0][0] = 0; int qX[n * m], qY[n * m]; int front = 0, rear = 0; qX[rear] = 0; qY[rear] = 0; rear++; int dx[] = {-1, 0, 1, 0}; int dy[] = {0, 1, 0, -1}; while (front < rear) { int x = qX[front]; int y = qY[front]; front++; for (int i = 0; i < 4; ++i) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx >= 0 && ny >= 0 && nx < n && ny < m) { if (g[nx][ny] == 0 && d[nx][ny] == -1) { d[nx][ny] = d[x][y] + 1; qX[rear] = nx; qY[rear] = ny; rear++; } } } } return d[n-1][m-1];}
代码解释
- 读取输入:读取迷宫的大小n和m,以及迷宫的二维数组g。
- 初始化距离数组:创建一个距离数组d,初始化为-1,起点距离设为0。
- 队列初始化:将起点坐标加入队列。
- BFS处理:从队列中取出当前位置,检查四个方向,更新可通行位置的距离,并将新位置加入队列。
- 返回结果:当处理完队列后,返回终点的距离,即为最短路径的移动次数。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月21日 13时29分32秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
SNMP介绍及使用,超有用,建议收藏!
2019-03-06
HDU5589:Tree(莫队+01字典树)
2019-03-06
不停机替换线上代码? 你没听错,Arthas它能做到
2019-03-06
Python开发之序列化与反序列化:pickle、json模块使用详解
2019-03-06
采坑 - 字符串的 "" 与 pd.isnull()
2019-03-06
无序列表 - 链表
2019-03-06
Matplotlib绘制漫威英雄战力图,带你飞起来!
2019-03-06
机器学习是什么
2019-03-06
《小王子》里一些后知后觉的道理
2019-03-06
《你当像鸟飞往你的山》总结
2019-03-06
《我是猫》总结
2019-03-06
《抗糖化书》总结
2019-03-06
apache虚拟主机配置
2019-03-06
PHP官方网站及PHP手册
2019-03-06
mcrypt加密以及解密过程
2019-03-06
go等待N个线程完成操作总结
2019-03-06
ReactJs入门教程-精华版
2019-03-06
Python 之网络式编程
2019-03-06
MySql5.5安装步骤及MySql_Front视图配置
2019-03-06