DFS应用


DFS深度优先搜索在迷宫问题的使用

数据导入

在这里插入图片描述

问题1:输出路径个数

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@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))
# 3

问题2:输出最短路径

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@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))
# [(0, 0), (0, 1), (1, 1), (1, 2), (1, 3), (2, 3), (3, 3), (3, 2)]

问题3:输出所有可以到达的路径

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@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:
            # print('当前所在点为:({},{})'.format(nx, ny))
            route.append((nx, ny))
            vis[nx][ny] = 1
            dfs(nx, ny)
            vis[nx][ny] = 0
            route.remove((nx, ny))


dfs(0, 0)
# 到达终点处,该条路径为[(0, 0), (0, 1), (1, 1), (1, 2), (1, 3), (2, 3), (3, 3), (3, 2)]
#到达终点处,该条路径为[(0, 0), (0, 1), (0, 0), (1, 0), (1, 1), (1, 2), (1, 3), (2, 3), (3, 3), (3, 2)]
#到达终点处,该条路径为[(0, 0), (1, 0), (1, 1), (1, 2), (1, 3), (2, 3), (3, 3), (3, 2)]

总结

  1. 问题2中min_route要使用copy进行复制,因为是列表嵌套元组的方式,所以可能会存在浅复制的情况。
  2. vis的使用,需要在函数中对vis进行global全局变量的使用,不然在后续存储遍历节点时可能存在问题。
  3. dx和dy的使用,通过for循环,对四个方向进行遍历,将方向存储在dx和dy中,得到下一个遍历点的位置。
  4. return位置的选择。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值