DFS求解迷宫问题

这篇具有很好参考价值的文章主要介绍了DFS求解迷宫问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

dfs迷宫问题,深度优先,算法,图论

 dfs迷宫问题,深度优先,算法,图论

 下面来具体分析一下算法的具体实现

首先要进行搜索,对搜索方向的顺序规定为:右-->下-->左-->上

 dfs迷宫问题,深度优先,算法,图论

按照搜索顺序从起点开始搜索,在搜索的过程中将已经搜索过的位置设为已访问,这样我们就可以得到如下图所示的一条路线。

dfs迷宫问题,深度优先,算法,图论

在到达终点后要进行回溯,利用回溯找到其他路径,最终得出一个最短路径。下图蓝色箭头代表回溯路径,黄色箭头为回溯得出的新路径(其他路径就不在图中画出)。通过多次回溯发现最短路径step=7

dfs迷宫问题,深度优先,算法,图论

DFS求解迷宫问题的关键是利用回溯来找到最短路径,在代码实现上即是递归。通过二维数组

a[N][N]来表示地图上的空地和障碍物,二维数组v[N][N]数组来表示空地是否访问。

#include<cstdio>
using namespace std;
int m,n,p,q,min=99999999;//p,q是终点坐标 
int a[100][100];//地图 ,其中1表示空地,2表示障碍物 
int v[100][100]; //0表示未访问,1表示已访问 
void dfs(int x,int y,int step)
{
	if(x==p && y==q)
	{
		if(step<min)	
		min=step;
		return;//回溯 
	}
	//顺时针试探
	//右
	if(a[x][y+1]==1 && v[x][y+1]==0)
	{
		v[x][y+1]=1;
		dfs(x,y+1,step+1);
		v[x][y+1]=0;
	} 
	//下 
	if(a[x+1][y]==1 && v[x+1][y]==0)
	{
		v[x+1][y]=1;
		dfs(x+1,y,step+1);
		v[x+1][y]=0;
	} 
	//左
	if(a[x][y-1]==1 && v[x][y-1]==0)
	{
		v[x][y-1]=1;
		dfs(x,y-1-1,step+1);
		v[x][y-1]=0;
	} 
	//上 
	if(a[x-1][y]==1 && v[x-1][y]==0)
	{
		v[x-1][y]=1;
		dfs(x-1,y,step+1);
		v[x-1][y]=0;
	} 
	return;
} 

上述代码我们可以进行优化,将四个方向通过一个循环来实现就可以大大缩减代码量。

向右移动x不变,y+1;向下移动x+1,y不变;向左移动x不变,y-1;向上移动x-1,y不变。

dfs迷宫问题,深度优先,算法,图论

 通过x,y值的变化我们可以通过两个方向数组dx[4]={0,1,0,-1},dy[4]={1,0,-1,0}来表示不同的方向,

再通过tx=x+dx,ty=y+dy就可以实现方向的变化

#include<cstdio>
using namespace std;
int m,n,p,q,min=99999999;//p,q是终点坐标 
int a[100][100];//地图 ,其中1表示空地,2表示障碍物 
int v[100][100]; //0表示未访问,1表示已访问 
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0}; 
void dfs(int x,int y,int step){
	if(x==p && y==q)
	{
		if(step<min)	
		min=step;
		return;//回溯 
	}
	for(int k=0;k<=3;k++)
	{
		int tx,ty;
		tx=x+dx[k];
		ty=y+dy[k];
		if(a[tx][ty]==1 && v[tx][ty]==0)//如果(是空地 并且 没有被访问) 
			{
			v[tx][ty]=1;//设置为已访问 
			dfs(tx,ty,step+1);
			v[tx][ty]=0;
			}
	}
	return;
}

下面为完整代码 

#include<cstdio>
using namespace std;
int m,n,p,q,min=99999999;//p,q是终点坐标 
int a[100][100];//地图 ,其中1表示空地,2表示障碍物 
int v[100][100]; //0表示未访问,1表示已访问 
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0}; 
 
void dfs(int x,int y,int step){
	if(x==p && y==q)
	{
		if(step<min)	
		min=step;
		return;//回溯 
	}
	for(int k=0;k<=3;k++)
	{
		int tx,ty;
		tx=x+dx[k];
		ty=y+dy[k];
		if(a[tx][ty]==1 && v[tx][ty]==0)//如果(是空地 并且 没有被访问) 
			{
			v[tx][ty]=1;//设置为已访问 
			dfs(tx,ty,step+1);
			v[tx][ty]=0;
			}
	}
	return;
}

int main()
{
	int startx,starty; 
	printf("请输入地图的行与列:\n"); 
	scanf("%d%d",&m,&n);
	printf("请输入地图障碍物布局:\n");1表示空地,2表示障碍物
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++)
		scanf("%d",&a[i][j]);//1表示空地,2表示障碍物
	printf("请输入起点坐标和终点坐标:\n");	
	scanf("%d%d%d%d",&startx,&starty,&p,&q);
	v[startx][starty]=1;
	dfs(startx,starty,0);
	printf("需要%d步",min);
	
	return 0;
	
}

运行结果如下图所示

dfs迷宫问题,深度优先,算法,图论

 以上是编程小白对于DFS解决迷宫问题的学习心得,可能还存在者问题,欢迎大佬给出建议。

参考B站UP主麦克老师讲算法的视频,视频链接如下:

dfs(迷宫求解代码实现)_哔哩哔哩_bilibili文章来源地址https://www.toymoban.com/news/detail-516544.html

到了这里,关于DFS求解迷宫问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法导论】图论(图的基本概念,图上的深度优先搜索(DFS),广度优先搜索(BFS),最小生成树(MST)及Prim,Kruskal算法)

    图(Graph)是一种包含节点与节点的边的集合,记作G=(V,E),V是节点的集合,E是边的集合。 有向图 一个有向图G=(V,E),E中每个元素是V上的一个二值关系:一条从a出发的连向b的边e可以记作一个 有序 对e = (a,b) 。 无向图 一个无向图G=(V,E),E的每个元素e可以表示V上的一个 无序 对,记

    2024年02月03日
    浏览(33)
  • 【蓝桥杯Java组】用Java带你暴走迷宫—DFS深度优先搜索

    📖📖 走迷宫 一类的问题一般都是暴力搜索解决,搜索的方法有两种:深度优先(DFS)和广度优先(BFS),而提到DFS就离不开递归,涉及到递归的问题理解起来还是有难度的,代码编写不当很容易造成栈溢出。 🌻🌻今天就用三道 走迷宫 问题带你彻底搞懂怎么用DFS秒杀迷宫

    2023年04月11日
    浏览(28)
  • 深度优先搜索(DFS)算法

    目录 算法思想 时间复杂度和空间复杂度 算法实现 算法优缺点 应用领域 深度优先搜索(DFS)算法的思想是从图的某个起始顶点开始,沿着一条路径尽可能深入地访问图中的所有顶点,直到不能继续为止,然后返回并探索其他路径。具体而言,DFS算法使用栈数据结构来实现,

    2024年02月05日
    浏览(33)
  • 深度优先搜索(DFS)(算法笔记)

    本文内容基于《算法笔记》和官方配套练题网站“晴问算法”,是我作为小白的学习记录,如有错误还请体谅,可以留下您的宝贵意见,不胜感激。 深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法,总是以“深度”作为前进的。实现方式是有很多,最

    2024年02月08日
    浏览(39)
  • 【算法】(BFS/DFS)迷宫路径问题(C语言)

    题目 :现有一迷宫如下图所示,蓝色部分为墙壁,白色部分为通路,入口在左上角(1,1)处,出口在右下角(8,8)处,试找出一条路径以通过该迷宫(路径不能重叠)。 分析 : ① 使用二维数组来存储迷宫,墙用 1 表示,路用 0 表示,如下图所示: 为与题目中的入口坐标

    2024年02月07日
    浏览(74)
  • 第一周算法训练(dfs)(深度优先搜索算法)

    dfs: 深度优先搜索算法 ,是一种用于遍历或 搜索树或图的算法 .沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被

    2024年02月20日
    浏览(40)
  • 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次。(连通图与非连通图) 1、访问指定的起始顶点; 2、若当前访问的顶点的邻接顶点有未被访问的,则任选一个访问之;反之,退回到最近访问过的顶点;直到与起始顶点相通的全部顶点都访问完毕; 3、若

    2024年01月17日
    浏览(36)
  • 如何实现一个简单的深度优先搜索(DFS)算法?

    前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一

    2024年02月07日
    浏览(44)
  • DFS(深度优先遍历、N皇后问题、2N皇后问题)

    目录 一、回溯法与深度优先搜索(DFS) 二、DFS与二叉树的前序遍历 2.1、二叉树的前序遍历 2.2、DFS 全排列  2.3、分析 三、N皇后问题 1. 回溯法: 是一种通过探索所有可能的候选解来找出所有解的算法。如果候选解被确认不是一个解的话(或者至少不是最后一个解),回溯法

    2024年03月21日
    浏览(43)
  • Python算法:深度优先搜索—DFS(模板及其样例)

    • 沿着一条路径一直搜索下去,在无法搜索时,回退到刚刚访问过的节点。 • 并且每个节点只能访问一次。 • 本质上是持续搜索,遍历了所有可能的情况,必然能得到解。 • 流程是一个树的形式,每次一条路走到黑。 • 目的主要是达到被搜索结构的叶结点直到最后一层

    2024年03月24日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包