问题理解
你需要在一个迷宫中找出所有无法到达出口的位置。迷宫由一个二维字符数组表示,其中:
.表示空地U、D、L、R分别表示向上、下、左、右移动的传送机关O表示出口- 当玩家踩到传送机关时,会被强制传送到指定方向的下一个格子
- "环"指的是几个传送机关首尾相连,比如:→↓←↑ 这样形成一个循环
题目要求我们找出所有"危险"的位置数量:如果从这些位置出发,无论怎么走都到不了出口。
什么情况下无法到达出口?
- 陷入循环(比如踩到了形成环的传送门)
- 走到死路(比如被传送到边界外)
- 所有可能的路径都导致上述两种情况
判断逻辑:
-
用
visited集合检测循环 -
用
is_valid函数检测越界 -
用递归遍历所有可能路径:
- 传送点只能按指定方向走
- 普通点可以尝试所有方向
-
如果某个起点位置的所有可能路径都无法到达出口,就是危险位置
数据结构选择
- 二维数组:用于存储迷宫的地图。
- 访问标记数组:用于记录哪些位置已经被访问过。
- 队列:用于实现广度优先搜索(BFS),从出口开始反向搜索,标记所有可以到达的位置。
算法步骤
-
初始化:
- 创建一个与迷宫大小相同的二维数组
visited,用于标记哪些位置已经被访问过。 - 找到出口的位置
(exit_x, exit_y)。
- 创建一个与迷宫大小相同的二维数组
-
反向BFS:
- 从出口位置开始,使用BFS遍历所有可以到达的位置,并标记这些位置为已访问。
- 对于每个位置,根据传送机关的方向移动到下一个位置,继续BFS。
-
统计结果:
- 遍历整个迷宫,统计所有未被访问过的位置,这些位置就是无法到达出口的位置。
如何判断一个位置是否在传送环中
思路:
- 访问标记:我们需要一个二维数组
visited来记录每个位置是否已经被访问过。 - 递归或栈:我们可以使用递归或栈来模拟传送过程,并检查是否存在环。
具体步骤:
-
初始化:
- 创建一个与迷宫大小相同的二维数组
visited,用于标记哪些位置已经被访问过。 - 创建一个与迷宫大小相同的二维数组
in_stack,用于标记当前路径上的位置。
- 创建一个与迷宫大小相同的二维数组
-
递归检查:
- 从每个位置开始,递归地检查是否存在环。
- 如果一个位置已经在当前路径上(即
in_stack为True),则说明存在环。