algorithm - 从所有起点解决迷宫

标签 algorithm depth-first-search breadth-first-search

最近我遇到一个问题:
假设一个迷宫有字符 *,.,C .* 代表墙壁,. >/C 是允许的。只有一个点被标记为C。现在,给定一个机器人站在任何允许的点上,存在一系列命令(例如LDDRULLLRRDU等),这样如果机器人从任何允许的点,它至少通过 C 一次。
例如:

******
*.C..*
**.***
*....*
******

命令:RLLURUU

现在我知道如何使用 DFS/BFS 解决迷宫(最短路径)。但是任何人都可以提示我如何处理这样的问题吗?
编辑:如果下一步是进入墙壁/外部迷宫,则会被忽略。和往常一样 L 向左 R 向右 U 向上 D 向下。

最佳答案

这个问题与synchronizing words的概念有关。或有限自动机的重置序列。您可以想象构建一个自动机,其中

  1. 每个开放空间加上C,就是一个状态;
  2. 对于每次撞墙的 Action ,除 C 之外的每个状态都会转换为自身;
  3. 如果在指定方向上存在开路点,则除 C 之外的每个状态都会转换到该方向上的相邻开路状态;和
  4. C 状态在所有 Action 中都会转换到自身。

给定这个自动机,您现在正在寻找一个将每个状态带到 C 状态的序列,从而与同步单词建立联系。有多种算法用于查找同步词,其中任何一种都可以用来解决这个特定问题。一种选择是 build the power automaton from the original automaton并寻找从起始状态到 C 状态的路径,(我相信)最终成为谈论将虚拟机器人折叠在一起的评论的理论上最佳版本(因为它总是会找到最佳路径。)

关于algorithm - 从所有起点解决迷宫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38558933/

相关文章:

java - 如何在邻接矩阵的广度优先搜索中跟踪每个顶点的深度? ( java )

python - 从边列表计算创建的图数和每个图中的顶点数

algorithm - 对于树的每个节点,找到最近的祖先节点,使得 val[node] 与 val[ancestor] 互质

algorithm - 查找二维 map 中无法到达的部分

java - 如何对还包含对象列表的对象列表执行 DFS

algorithm - 计算DFS算法的时间复杂度

algorithm - 找到图的节点,它们之间至少有 2 条路径

c++ - 最小化广度优先搜索的内存使用

java - 我的 "contains"算法有什么问题?

java - 为什么下面的数组返回 false?