【每日一题】带限制的DFS——逃离大迷宫,今天开始恢复更新

本文介绍了一种使用深度优先搜索(DFS)解决LeetCode上的1036.逃离大迷宫问题的方法。由于数据量较大且无最短路径需求,采用优化后的DFS算法,利用距离限制进行搜索。当搜索的点与原点的曼哈顿距离达到封锁格子的最大数量时,即可确定可以找到路径。解题代码和思路进行了分享。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1036. 逃 离 大 迷 宫 \color{red}{1036. 逃离大迷宫} 1036.

在一个 10^6 x 10^6 的网格中,每个网格上方格的坐标为 (x, y)

现在从源方格 source = [sx, sy] 开始出发,意图赶往目标方格 target = [tx, ty] 。数组 blocked 是封锁的方格列表,其中每个 blocked[i] = [xi, yi] 表示坐标为 (xi, yi) 的方格是禁止通行的。

每次移动,都可以走到网格中在四个方向上相邻的方格,只要该方格 在给出的封锁列表 blocked 上。同时,不允许走出网格。

只有在可以通过一系列的移动从源方格 source 到达目标方格 target 时才返回 true。否则,返回 false

数据(关键)约束:

  • 0 <= blocked.length <= 200
解题思路:
  1. 首先对于这种网格中找路径的问题,一般都是通过搜索算法解题——根据是否要求最短路径,数据量大小等酌情选取DFS或者BFS,以及其他更优的搜索算法…
  2. 由于这道题的数据量,而且没有要求找一条最短的“逃脱”路径,如果通过BFS逐步扩展的话肯定没机会的;考虑一下DFS,在根据这道题的Hard难度,不难想到使用优化后的DFS算法——最常见的优化就是剪枝优化了(常用剪枝策略有三种:记忆化-相同值从记忆数组中提取结果、最优解判断-如果当前枝差于当前最优剪枝、可行性剪枝-当前枝不可能获得解剪枝)
  3. 但是这道题应该不是剪枝,而属于距离限制的DFS搜索:由于一个特殊的数据约束,封锁格子最多只有200格,假设这些格子按照斜线排序达到最好封锁效果,类似与如下边,只要DFS到达的点和原点的曼哈顿距离到达一定范围,即肯定冲破封锁。这个范围根据最好的封锁效果(图1)不难得到为blocked.length
  4. 于是,在DFS达到据原点一定距离的点,或者直接搜索到目标,即表示该节点“free”了

解题代码:

还有很大改进空间:

class Solution {
   
    //封锁格子数量
    int len;
    //上下左右方向数组
    int[][] d;
    //保存访问信息
    Map<Integer,Set<Integer>> v;
    //全局block
    int[][] b;

    public boolean isEscapePossible(int[][
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码之狐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值