迷宫问题(dfs)

其实我也不咋会

迷宫问题是一个基本的搜索与回溯的练习题,迷宫问题有四种解法:深度优先搜索,广度优先搜索,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 + 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个Python版的深度优先搜索算法生成迷宫问题的示例代码: ```python import random def generate_maze(rows, cols): # 创建一个 rows 行 cols 列的二维数组,初始化为全 1 maze = [[1] * cols for _ in range(rows)] # 将起点设置为 (0, 0),并将其标记为 0 start_row, start_col = 0, 0 maze[start_row][start_col] = 0 # 使用深度优先搜索算法生成迷宫 dfs(maze, start_row, start_col) return maze def dfs(maze, row, col): # 定义四个方向:上、下、左、右 directions = [(0, -1), (0, 1), (-1, 0), (1, 0)] # 随机打乱方向的顺序 random.shuffle(directions) # 遍历每个方向 for direction in directions: # 计算新的坐标 new_row, new_col = row + direction[0], col + direction[1] # 判断新坐标是否越界或已经被访问过 if (new_row < 0 or new_row >= len(maze) or new_col < 0 or new_col >= len(maze[0]) or maze[new_row][new_col] == 0): continue # 打通当前坐标与新坐标之间的墙壁 if direction == (0, -1): # 左 maze[row][col-1] = 0 elif direction == (0, 1): # 右 maze[row][col+1] = 0 elif direction == (-1, 0): # 上 maze[row-1][col] = 0 elif direction == (1, 0): # 下 maze[row+1][col] = 0 # 递归访问新坐标 dfs(maze, new_row, new_col) # 生成一个 5x5 的迷宫 maze = generate_maze(5, 5) # 打印迷宫 for row in maze: print(row) ``` 这个示例代码可以生成一个指定大小的迷宫,并使用深度优先搜索算法生成迷宫的路径。其中,生成迷宫的主要逻辑在 `generate_maze()` 函数中,它首先创建一个二维数组表示迷宫,然后使用深度优先搜索算法从起点开始访问迷宫中的所有格子,并打通相邻格子之间的墙壁,最终生成迷宫的路径。在这个示例代码中,我们使用随机打乱方向的顺序来增加迷宫的随机性。最后,我们打印生成的迷宫,查看迷宫的路径和墙壁的布局。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值