DFS深度优先搜索在迷宫问题的使用
数据导入
![在这里插入图片描述](https://img-blog.csdnimg.cn/00e3441a162640e4abc505817d830ddf.png)
问题1:输出路径个数
'''
@Project :蓝桥杯
@File :DFS-test.py
@IDE :PyCharm
@Author :Pan Youxuan
@Date :2023/3/27 18:51
@Descib :输出总的路径长度。
'''
A = [
[0, 0, 1, 0]
, [0, 0, 0, 0]
, [0, 0, 1, 0]
, [0, 1, 2, 0]
, [0, 0, 0, 1]
]
vis = [[0] * 10 for _ in range(10)]
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
count = 0
def dfs(x, y, step):
global vis
global count
if A[x][y] == 2:
count += 1
for i in range(3):
nx = x + dx[i]
ny = y + dy[i]
if nx in range(5) and ny in range(4) and vis[nx][ny] == 0 and A[nx][ny] != 1:
vis[nx][ny] = 1
dfs(nx, ny, step + 1)
vis[nx][ny] = 0
return count
print(dfs(0, 0, 0))
问题2:输出最短路径
'''
@Project :蓝桥杯
@File :DFS-test.py
@IDE :PyCharm
@Author :Pan Youxuan
@Date :2023/3/27 18:51
@Descib :使用DFS输出最短的路径,注意,最短路径可能有多条,只会输出一条。
'''
A = [
[0, 0, 1, 0]
, [0, 0, 0, 0]
, [0, 0, 1, 0]
, [0, 1, 2, 0]
, [0, 0, 0, 1]
]
vis = [[0] * 10 for _ in range(10)]
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
route = [(0, 0)]
min_route = [0] * 9999
def dfs(x, y, step):
global vis
global route
global min_route
if A[x][y] == 2:
if len(min_route) > len(route):
min_route = route.copy()
for i in range(3):
nx = x + dx[i]
ny = y + dy[i]
if nx in range(5) and ny in range(4) and vis[nx][ny] == 0 and A[nx][ny] != 1:
route.append((nx, ny))
vis[nx][ny] = 1
dfs(nx, ny, step + 1)
vis[nx][ny] = 0
route.remove((nx, ny))
return min_route
print(dfs(0, 0, 0))
问题3:输出所有可以到达的路径
'''
@Project :蓝桥杯
@File :DFS-test.py
@IDE :PyCharm
@Author :Pan Youxuan
@Date :2023/3/27 18:51
@Descib :使用DFS输出所有从起点到终点的路径。
'''
A = [
[0, 0, 1, 0]
, [0, 0, 0, 0]
, [0, 0, 1, 0]
, [0, 1, 2, 0]
, [0, 0, 0, 1]
]
vis = [[0] * 10 for _ in range(10)]
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
route = [(0,0)]
def dfs(x, y):
global vis
global route
if A[x][y] == 2:
print('到达终点处,该条路径为{}'.format(route))
return 1
for i in range(3):
nx = x + dx[i]
ny = y + dy[i]
if nx in range(5) and ny in range(4) and vis[nx][ny] == 0 and A[nx][ny] != 1:
route.append((nx, ny))
vis[nx][ny] = 1
dfs(nx, ny)
vis[nx][ny] = 0
route.remove((nx, ny))
dfs(0, 0)
总结
- 问题2中min_route要使用copy进行复制,因为是列表嵌套元组的方式,所以可能会存在浅复制的情况。
- vis的使用,需要在函数中对vis进行global全局变量的使用,不然在后续存储遍历节点时可能存在问题。
- dx和dy的使用,通过for循环,对四个方向进行遍历,将方向存储在dx和dy中,得到下一个遍历点的位置。
- return位置的选择。