迷宫问题(dfs)

本文介绍了迷宫问题的基本搜索与回溯练习,重点讲解了使用深度优先搜索(DFS)算法解决该问题。DFS的思想是搜索+回溯,通过试探路径并回溯寻找最短路径。文章给出了具体的实现步骤,包括初始化、判断、试探和回溯过程,并提供了样例输入和输出。
摘要由CSDN通过智能技术生成

其实我也不咋会

迷宫问题是一个基本的搜索与回溯的练习题,迷宫问题有四种解法:深度优先搜索,广度优先搜索,A*,dijkstra。但是其他三种我都不会过于复杂,所以我只给你讲深度优先搜索算法。

假设一个瞎子在一个迷宫里(别跟我抬杠,没有导盲犬也没有手杖),他要走到这个迷宫的终点,怎么走?因为这个瞎子不仅瞎,而且是个弱智,所以他只能用弱智的方法走出这个迷宫——反复试探,撞着墙了就退回去,再向另一个方向反复试探。一般来说,我们都是顺时针撞墙试探,即先右再下再左再上。这就是dfs的基本思想——搜索+回溯,说人话就是,不撞南墙不回头。

dfs先是要判断一下到底能不能到达这个地方(只要……能到达那个地方……)要是能到,就把到达那个地方走过的路径存在一个数组里,然后走下一条道,把每个走法全列出来,取走的路径长度最小值。

注:所有搜索算法的时间复杂度都贼拉大,但是出题人一般不会太鸡贼,数据不会太大

导入头文件是婴儿都会做的事,就不管了

由于我们这道题用了数组的方法,而数组的初值又是0,所以我们不能用0和1表示空地和墙,一般用1表示空地,2表示墙。

理论存在,实践开始

首先,定义四个整型变量,表示起点坐标和终点坐标。

int sx, sy, ex, ey;

sx和sy表示起点坐标,ex和ey表示终点坐标。
紧接着,我们再定义一个变量,表示最短路径。

int minn=1145141919;

由于取的是最小值,所以我们要取一个贼拉酷炫贼拉大的数。

接下来,用二维数组存储地图和已走过的路径

int map[114][514], visit[114][514];

接下来,我们就要写函数了。

由于dfs不返回值,修改的是数组本身,所以返回值我们用void

void dfs(int x,int y,int step);

x,y分别是起点的x坐标和y坐标,step一般是0,别问,你知道就行

接下来我们来写函数里的代码

我们在dfs中,我们需要先判断步数是否小于最小值,如果小于就更新,然后回溯。

if (x == ex && y == ey) {
   
	if (step < minn)minn = step;
	return;
}

接着,开始撞墙试探

我们之前说过,试探的方向是右下左上,那么我们先写右。

if (map[x][y + 1] == 1 && visit[x][y + 1] == 0) {
   
	visit[x][y + 1] = 1;
	dfs(x, y + 1, step + 1);
	visit[x][y + 1] = 0;
}

这段代码的意思是,如果右边是空地,而且没去过这个地方,那就把右边的点设置为已访问。

以此类推,我们直接把其它三个点一股脑全写上

//往下撞
if (map[x + 1][y] == 1 && visit[x + 1][y] == 0) {
   
	visit[x + 1][y] = 1;
	dfs(x + 1, y, step + 1);
	visit[x + 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值