走迷宫问题广度优先算法实现

迷宫问题的三种求解方法(递归求解、回溯求解和队列求解) 目录 一、迷宫问题的三种求解方法 递归求解 回溯求解 队列求解 二、华为迷宫问题 一、迷宫问题的三种求解方法 在迷宫问题中,给定入口和出口,要求找到路径。本文将讨论三种求解方法,递归求解、回溯求解和队列求解。 在介绍具体算法之前,先考虑将迷宫数字化。这里将迷宫用一个二维的list存储(即list嵌套在list里),将不可到达的位置用1表示,可到达的位置用0表示,并将已经到过的位置用... 阅读详情

走迷宫问题

迷宫是许多小方格构成的矩形,在每个小方格中有的是墙(用1表示),有的是路(用0表示)。走迷宫就是从一个小方格沿上、下、左、右四个方向到邻近的方格,当然不能穿墙。

问题描述
实现生成迷宫(从文本中读取数据生成),输出迷宫(图案方式),探索迷宫路径(最短路径),输出迷宫路径(图案方式)。

输入的文件内容格式为:

6 5
0 1 0 1 1
0 0 1 1 1
1 0 0 1 1
0 1 0 0 1
1 1 1 0 0
1 1 1 1 0

开头一行表示地图为6行5列,地图中0表示路,1表示障碍物。现在规定从左上角进入迷宫从右下角出迷宫。

算法分析
在任意位置,理论上有四个位置可以走,上下左右。现在位于位置0,走一步可以走的位置为:

也就是当前位置为0,可以走的位置为1,相同道理,走2步可以走的位置为:

当位于0时,可以探索的位置为周围的四个1,广度优先的算法是根据状态可分为两种状态,当前位置和下一步可以为的位置,当前位置为0,下一步可以为的位置为1,通过队列将下一步位置先保存起来,遍历下一步可以为的4个1位置,再分别根据位于4个1位置时探索下一步的位置。如果当位于0位置找到一个下一步位置1之后再直接进行下一步探索则成了深度优先算法。

以起始点为出发,将这个点按照某个方向规则走,周围所有可以走的位置依次写入到队列,这个点走完之后,队首出队列,走这个点四周所有可以走的点,按照之前的规则,将周围可走的点依次放入到队列中,重复之前过程,直到队列为空或者走到终点。在这个过程中在借助一个辅助矩阵,存放起点到位置的最短路径。

源码分析

//坐标结构
type point struct {
	i int
	j int
}

//分别代表上左下右
var dirs = [4]point{
	{-1, 0},
	{ 0, -1},
	{ 1, 0},
	{ 0, 1},
}

//读取地图文件
func readMaze(fileName string) [][]int {
	file, err := os.Open(fileName)
	if err != nil {
		panic("open file fail")
	}

	var row, col int
	var changeLine int
	fmt.Fscanf(file, "%d %d", &row, &col)

	maze := make([][]int, row)
	for i := range maze {
		maze[i] = make([]int, col)
		
		//读取文件过程中遇到换行读取为0
		fmt.Fscanf(file, "%d", &changeLine)

		for j := range maze[i] {
			fmt.Fscanf(file, "%d", &maze[i][j])
		}
	}

	return maze
}

func walkMaze(maze [][]int, start, end point)([][]int,bool) {
	steps := make([][]int, len(maze))

	for i := range steps {
		steps[i] = make([]int, len(maze[0]))
	}
	
	//保存四周下一步可以出现位置
	Q := []point{start}

	for len(Q) > 0 {
		cur := Q[0]
		Q = Q[1:]

		for _, dir := range dirs {
			next := cur.add(dir)
			//1代表障碍物
			nextValue, ok := next.at(maze)
			if !ok || nextValue == 1 {
				continue
			}
			//下一步必须是还没走过的位置
			nextValue, ok = next.at(steps)
			if !ok || nextValue != 0 {
				continue
			}
			//不能走到其实位置
			if next == start {
				continue
			}
		
			Q = append(Q,next)

			mazeValue, ok := cur.at(steps)
			if ok {
				steps[next.i][next.j] = mazeValue + 1
			}

		}
	}
	//当走到终点时,则终点位置会被赋值为走过的步数
	if steps[len(steps)-1][len(steps[0])-1] == 0 {
		return steps,false
	}

	return steps,true
}

完整源码

DFS练习-迷宫(最短路径)问题详解 一波三折 图片+文字 dfs迷宫问题的详细解析,图文并茂,包含洛谷acwing上的两题。 阅读详情

相关推荐

广度优先搜索实现走迷宫问题(c++实现)

广度优先搜索可以找到最短的走出迷宫的路径,看能不能走出迷宫很简单,由于广度优先搜索总是找到离某点最近的下一个点,找到的路径一定是最短路径,详见算法笔记上关于广度优先搜索的介绍,问题是如何输出走出迷宫的路径,我们可以申请一个和迷宫一样大的储存点信息的path二维数组,path中的任意元素为到达他之前的点的信息,然后输出path即可。 代码如下: #include"pch.h" #include...

weixin_41106545的博客 2632

回溯算法(十进制转二进制)

【概念】 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有...

Smile 4242

【BFS】走迷宫求步数

题目 给定一个m*n大小的迷宫,其中 * 代表不可通过的墙壁,“.”代表平地,S表示起点,T表示终点。 移动过程中,只能前往上下左右四个位置的平地,求从起点S到终点T的最少步数。 输入 5 5 ..... .*.*. .*S*. .***. ...T* 2 2 4 3 输出 11 #include <cstdio> #include <queue> using namespace std; const int maxn = 100; char matrix[maxn][ma

qq_45601866的博客 563

地下迷宫——滴滴

题目描述 小青蛙有一天不小心落入了一个地下迷宫,小青蛙希望用自己仅剩的体力值P跳出这个地下迷宫。为了让问题简单,假设这是一个n*m的格子迷宫,迷宫每个位置为0或者1,0代表这个位置有障碍物,小青蛙达到不了这个位置;1代表小青蛙可以达到的位置。小青蛙初始在(0,0)位置,地下迷宫的出口在(0,m-1)(保证这两个位置都是1,并且保证一定有起点到终点可达的路径),小青蛙在迷宫中水平移动一个单位距离需要消耗1点体力值,向上爬一个单位距离需要消耗3个单位的体力值,向下移动不消耗体力值,当小青蛙的体力值等于0的时候

清风拂面 573

算法小课堂:走迷宫之DFS vs BFS

算法小课堂:走迷宫之DFS vs BFS前言DFS走迷宫算法思路代码实现细节样例测试BFS走迷宫算法原理代码实现细节样例测试两种方法的对比总结Reference 前言   上期我们说到DFS的经典入门题目——Fibonaci数列的第n项,这次我们来说下DFS或者BFS较为经典的走迷宫题目解法,很多关于迷宫类题目的母题都是这个了,而且也很容易理解,冲冲冲!   我们约定迷宫里出口用S表示,出口用T表示,可以通行(不是一方通行)的格子用点表示,障碍物(即不能通行)的格子用*表示。   类似如下的输入形式: ..

weixin_40519529的博客 2671

BFS走迷宫

先来讲一下bfs(广度优先搜索)的理解和模扳; BFS(广度优先搜索) bfs是一个对连通图进行遍历的算法。它的思想是从一个被选定的点出发;然后从这个点的所有方向每次只走一步的走到底(即其中一个方向走完一步之后换下一个方向继续走);如果得不到目的解,那就返回事先定好的值,如果找到直接返回目的解。 如图所示,从1开始搜,有2,3,4几个点,存起来,从2开始有5,6,存起来,搜3,有7,8,存起来,搜4,没有了;现在开始搜刚刚存的点,从5开始,没有,然后搜6.。。一直进行,直到找到; ...

m0_62881629的博客 2707

递归——走迷宫问题

else if (findWay(map, i - 1, j)) { //向上走。System.out.println("====找路的情况如下====");if (map[i][j] == 0) {//表示这个位置可以为初始位置。System.out.println("====地图如下====");System.out.println("====找路的情况如下====");//先假设这个位置可以走。// 从 (1,1) 开始走。System.out.println("====地图如下====");

2302_81105793的博客 833

【c++】广度优先搜索

了解了队列,我们就可以学习广搜代码了。

bhffvhjbjjikiffg的博客 1762

实现迷宫问题的最优解的非递归算法_算法浅谈——走迷宫问题与广度优先搜索...

点击上方蓝字,和我一起学技术。在之前周末LeetCode专栏当中,我们详细描述了深度优先搜索和回溯法,所以今天我们继续这个话题,来和大家聊聊搜索算法的另一个分支,广度优先搜索。广度优先搜索的英文是Breadth First Search,简写为bfs。与它相对的深度优先搜索,英文自然就是Depth First Search,简写成dfs。所以如果在阅读我或者其他人的代码时发现有个函数叫做...

weixin_36465618的博客 750

CST新手必看:共面波导色散曲线绘制全流程(附参数设置避坑指南)

本文详细介绍了CST Microwave Studio中绘制共面波导色散曲线的全流程操作,特别针对新手常见的边界条件设置错误、参数扫描失效等问题提供解决方案。通过模型建立、边界条件设置、本征模求解器配置等步骤,帮助工程师快速掌握CPW色散特性分析方法,并附有参数设置避坑指南,提升高频电路设计效率。

tomato的博客 986

ADS AEL脚本进阶:参数化电感与变压器的自动化设计

本文深入探讨了如何利用ADS AEL脚本实现电感与变压器的参数化与自动化设计。通过构建可复用的函数库、封装高级设计流程、集成DRC检查与性能预估,将繁琐的手动绘制升级为高效的智能设计引擎,并最终通过创建GUI工具降低使用门槛,大幅提升射频/微波电路设计效率。

weixin_29309785的博客 203

LQ训练营(C++)学习笔记_广度优先搜索

广度优先搜索 队列是一种线性的数据结构,和栈一样是一种运算受限制的线性表。只允许从表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。 C++中queue的实现在一个<queue>头文件中,在代码开头引入这个头文件,并在引入所有头文件后加上一句using namespace std #include<queue> using namespace std...

qq_41807261的博客 495

Rockit VDEC解码实战:从零构建高效视频处理流水线

本文详细介绍了Rockit VDEC硬件解码模块在RK3568/RK3588平台的应用实践,涵盖开发环境配置、MPI接口使用、码流发送模式选择、内存管理优化及多路解码系统构建。通过实战案例展示如何利用VDEC实现高效视频处理流水线,显著降低CPU占用率,提升嵌入式多媒体开发效率。

ol789012的博客 304

习题:走迷宫2 (java bfs)

package lanqiaobei; import java.util.*; /* 习题:走迷宫2 给你一个n行m列的二维迷宫。'S'表示起点,'T' 表示终点,'#' 表示墙壁,'.' 表示平地。你需要从 'S' 出发走到 'T',每次只能上下左右走动,并且不能走出地图的范围以及不能走到墙壁上。请你计算出走到终点需要走的最少步数。 输入格式 第一行输入n, m表示迷宫大小。(1≤n,m...

pioneer的博客 1780

Qt+OpenGL+Cesium三件套:打造高性能3D GIS桌面应用的5个关键点

本文深入探讨了如何利用Qt、OpenGL和Cesium数据规范构建高性能桌面级3D GIS应用。文章聚焦于五个关键点:架构选型、OpenGL渲染优化、3D Tiles数据解析与调度、内存与多线程管理,以及高级特性实现,旨在帮助开发者在C++生态中打造不依赖网络、运算能力更强的重型3D地理信息客户端。

weixin_28197941的博客 380

Vue3 + EventSource 实战:手把手教你打造实时AI聊天悬浮窗(附完整代码)

本文详细介绍了如何使用Vue3和EventSource技术构建一个实时AI聊天悬浮窗。文章从产品化视角出发,重点讲解了流式数据接收与渲染、悬浮窗UI交互的工程化实现、性能优化及高级功能,并提供了完整的代码示例,帮助开发者快速集成功能完整的AI问答系统。

assembly8low的博客 844

大胖子走迷宫 [蓝桥杯 ]

题述 大胖子走迷宫 原题链接 分析 与普通走迷宫其实是一样的,就是多了胖子的体型会变化,以及下一步原地不动的限制条件。我们可以套用标准的bfs模板,然后加上到了k时刻及2k时刻半径(假如占用5x5,那么半径为 r = 5/2=2 )的变化,和原地不动也添加到队列中这几个条件积就可以了。 注意:1.地图起始是从0开始。2.原地不动的走法要放在往四个方向走的后面。 代码 #include<bits/stdc++.h> using namespace std; const int N = 303;

hai博客 1330

【ComfyUI】Wan2.2 + IndexTTS 图像数字人或动物口播视频生成

本文介绍了一个基于ComfyUI的数字人口播视频生成工作流,整合了IndexTTS和图像处理技术。该系统通过多模型协同工作,实现从形象图、文本和音频输入到自动生成口播视频的全流程。核心包含WanVideo系列模型,通过CLIP Vision、T5文本编码器和Wav2Vec语音模型分别处理视觉特征、语义理解和口型同步。工作流涵盖素材加载、特征提取、音频处理和视频生成等节点,支持人物、动物等多种主体的口播内容创作。该方案自动化程度高,适用于知识讲解、剧情旁白等多种场景,能帮助创作者高效产出高质量口播视频。

Mr数据杨 2052

BFS计算走迷宫步数(c++)

#include<iostream> #include<cstring> #include<queue> #define maxn 100 using namespace std; struct node{ int x,y; int step; }S ,T , Node; int n,m; char dataMat[maxn][maxn]; ...

weixin_45038753的博客 4万+

DICOM标准:DICOM医学影像中的覆盖层(Overlay)概念详解

DICOM标准:深入详解DICOM医学影像中的覆盖层(Overlay)

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1562

OTFS 消息传递算法信号检测【附matlab代码详解】

OTFS 消息传递算法方面的一些浅浅理解。

Cuby的博客 4011

实现图的宽度优先遍历_Python可视化优先算法:走迷宫

点击上方“简说Python”,选择“置顶/星标公众号”福利干货,第一时间送达!【作者简介】 冒绿光的盒子,公众号投稿作者,个人简书主页:https://www.jianshu.com/u/cbacf40d927f。走迷宫显示迷宫迷宫生成等等再提,先看一下迷宫的读取和显示。第一行是行数和列数,代表有101行101列,这个迷宫后面可以使用最小生成树生成。读进一个迷宫:publicclas...

weixin_39876450的博客 595

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

BFS(广度优先搜索,走迷宫问题)

广度优先遍历以及走迷宫问题

HBR666_的博客 735

精雕软件(JDpaint) 5.5 绿色版

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

信息学奥赛一本通:1251:仙岛求药 1252:走迷宫 1253:抓住那头牛 1254:走出迷宫

信息学奥赛一本通:1251:仙岛求药 1252:走迷宫 1253:抓住那头牛 1254:走出迷宫

ffsdfg的博客 817

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

AcWing 844 走迷宫 BFS模板题

AcWing 844 走迷宫 题目链接:https://www.acwing.com/problem/content/846/ 给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。 最初,有一个人位于左上角(1, 1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。 请问,该人从左上角移...

baobancha1923的博客 594

用回溯递归算法解决走迷宫问题

迷宫是由许多小方格构成的矩形,在每个小方格中有的是墙,有的是路,走迷宫就是从一个小方格沿上下左右四个方向到临近的方格,当然不能穿墙。设迷宫的入口是在左上角(1,1),出口是右下角(8,8)根据给定的迷宫,找出一条从入口到出口的路径。 算法设计思路:从入口开始广度优先搜索所有可到达的方格入队,再扩展队首方格,直到搜索到出口时算法结束。 以0表示路,-1表示墙,-2标记死胡同,dep标记走过的步数。 下面直接上代码,可能会更好理解。 #include<stdio.h> int maze[8][8]

Pinocchio216的博客 1649
上一篇: 以太坊p2p网络子协议开发框架运用
下一篇: Go语言TCP网络编程(详细)
码墨
博客等级 码龄11年 95粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值