豆包MarsCode AI 刷题-我好想逃却逃不掉 | 豆包MarsCode AI 刷题

133 阅读2分钟

问题理解

你需要在一个迷宫中找出所有无法到达出口的位置。迷宫由一个二维字符数组表示,其中:

  • . 表示空地
  • UDLR 分别表示向上、下、左、右移动的传送机关
  • O 表示出口
  • 当玩家踩到传送机关时,会被强制传送到指定方向的下一个格子
  • "环"指的是几个传送机关首尾相连,比如:→↓←↑ 这样形成一个循环

题目要求我们找出所有"危险"的位置数量:如果从这些位置出发,无论怎么走都到不了出口。

什么情况下无法到达出口?

  • 陷入循环(比如踩到了形成环的传送门)
  • 走到死路(比如被传送到边界外)
  • 所有可能的路径都导致上述两种情况

判断逻辑:

  1. visited集合检测循环

  2. is_valid函数检测越界

  3. 用递归遍历所有可能路径:

    • 传送点只能按指定方向走
    • 普通点可以尝试所有方向
  4. 如果某个起点位置的所有可能路径都无法到达出口,就是危险位置

数据结构选择

  1. 二维数组:用于存储迷宫的地图。
  2. 访问标记数组:用于记录哪些位置已经被访问过。
  3. 队列:用于实现广度优先搜索(BFS),从出口开始反向搜索,标记所有可以到达的位置。

算法步骤

  1. 初始化

    • 创建一个与迷宫大小相同的二维数组 visited,用于标记哪些位置已经被访问过。
    • 找到出口的位置 (exit_x, exit_y)
  2. 反向BFS

    • 从出口位置开始,使用BFS遍历所有可以到达的位置,并标记这些位置为已访问。
    • 对于每个位置,根据传送机关的方向移动到下一个位置,继续BFS。
  3. 统计结果

    • 遍历整个迷宫,统计所有未被访问过的位置,这些位置就是无法到达出口的位置。

如何判断一个位置是否在传送环中

思路:

  1. 访问标记:我们需要一个二维数组 visited 来记录每个位置是否已经被访问过。
  2. 递归或栈:我们可以使用递归或栈来模拟传送过程,并检查是否存在环。

具体步骤:

  1. 初始化

    • 创建一个与迷宫大小相同的二维数组 visited,用于标记哪些位置已经被访问过。
    • 创建一个与迷宫大小相同的二维数组 in_stack,用于标记当前路径上的位置。
  2. 递归检查

    • 从每个位置开始,递归地检查是否存在环。
    • 如果一个位置已经在当前路径上(即 in_stack 为 True),则说明存在环。