蓝桥云课——迷宫2 Python (深度优先遍历)

文章介绍了使用深度优先搜索(DFS)解决迷宫问题的思路,对比了DFS与广度优先搜索(BFS)的区别。DFS适用于寻找一个解或判断解的存在性,而BFS则常用于求最短路径。提供了一个DFS模板,并展示了如何应用在给定的迷宫问题上,通过遍历所有起点并进行DFS搜索来判断能否逃离迷宫。
摘要由CSDN通过智能技术生成

 题目地址:迷宫2

        一道比较简单的DFS模板题,那为什么我们要用DFS而不是使用用BFS呢?在此简单介绍一下DFS与BFS:

DFS:一条路走到底,如果不成功就回溯到上一个点继续走。DFS中存在栈,所以可以运用递归来解决相应问题,DFS会首先把一种可能的情况尝试到底,所以在面对“寻找一个解”“这个解是否存在?”这种找出xx解,建议优先使用DFS。

BFS:走路的同时如果发现有岔路口会随机进入一个岔路,然后将它的分路情况记录下来,然后再返回来进入另外一个岔路。BFS会一开始尝试所有情况,只要找到符合条件的便会return,所以在面对“最少步数的解”或者“最少交换次数”这种求最短,最少结果方式,建议优先使用BFS。


DFS相应模板(具体情况具体分析,有时需要用到栈):

def DFS(node):
    # 相应代码
    if 语句:  # 用于终止递归
        return
    # 相应代码
    for 循环:  # 用于循环递归
        # 相应代码
        DFS(node)
        # 相应代码

此题具体思路为:遍历所有点,DFS判断其是否能够逃出迷宫。

遍历:

for x in range(10):
    for y in range(10):
        arr = [[0] * 10 for _ in range(10)]
        DFS(x, y)

判断条件:

if x < 0 or x > 9 or y < 0 or y > 9:  # 逃出迷宫,ans += 1
    ans += 1
    return 1
    
if arr[x][y] == 1:  # 此点经过,困在迷宫循环,return跳出函数
    return 0

上下左右移动:

if maze[x][y] == 'U':
    DFS(x - 1, y)
elif maze[x][y] == 'D':
    DFS(x + 1, y)
elif maze[x][y] == 'L':
    DFS(x, y - 1)
elif maze[x][y] == 'R':
    DFS(x, y + 1)

完整代码:

maze = ['UDDLUULRUL',
       'UURLLLRRRU',
       'RRUURLDLRD',
       'RUDDDDUUUU',
       'URUDLLRRUU',
       'DURLRLDLRL',
       'ULLURLLRDU',
       'RDLULLRDDD',
       'UUDDUDUDLL',
       'ULRDLUURRR']
ans = 0
arr = [[0] * 10 for _ in range(10)]  # 判断是否经过

def DFS(x, y):
    global ans
    if x < 0 or x > 9 or y < 0 or y > 9:
        ans += 1
        return 1
    
    if arr[x][y] == 1:
        return 0

    arr[x][y] = 1  # 代表此点已经来过
    if maze[x][y] == 'U':
        DFS(x - 1, y)
    elif maze[x][y] == 'D':
        DFS(x + 1, y)
    elif maze[x][y] == 'L':
        DFS(x, y - 1)
    elif maze[x][y] == 'R':
        DFS(x, y + 1)
    return 0

for x in range(10):
    for y in range(10):
        arr = [[0] * 10 for _ in range(10)]
        DFS(x, y)

print(ans)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值