【问题标题】:Maze Solving From All Start Points从所有起点解决迷宫
【发布时间】:2016-07-25 02:35:06
【问题描述】:

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

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

命令:RLLURUU

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

【问题讨论】:

  • 水平移动的最远距离是 3 步;所以在例如之后; LLL,你只能在网格中的三个位置;再一个R,你可以在垂直走廊的三个位置;在 UU 之后你肯定会通过 C。所以一般来说:做一些移动来减少你可能在的位置的数量,然后跟踪你所有可能的机器人,并让每个机器人通过 C,使用“如果有墙,机器人就不动”规则。每次两个可能的机器人最终在同一个方格上时,移除其中一个。
  • @m69,感谢您的回答。但更清楚地说,您能否使用给出的示例并解释您得出答案的逻辑......谢谢!
  • 3行有9个可能的位置;在 LLL 之后,任何机器人都将位于其所在行的最左侧位置,因此现在您只有 3 个可能的位置;在另一个 R 之后,3 个机器人将在左二位置(垂直走廊);在 UU 之后,他们都会在 C 上结束。
  • 所以你从有多少位置的“虚拟”机器人开始,然后任何遇到另一个机器人的机器人都被移除,任何通过 C 的机器人都被移除,直到你没有机器人left(表示都经过C)。
  • @JimMischel (不是很清楚地表述)问题是关于找到一个从每个起始位置都起作用的序列,而不是确定给定序列的起始位置。

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


【解决方案1】:

这个问题与有限自动机的synchronizing words重置序列 的概念有关。你可以想象在哪里构建一个自动机

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

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

【讨论】:

  • “构建一个动力自动机”——即使我们只构建可访问的节点,它也是指数级的。有更快的吗?我什至不需要最短的同步词。
  • 您链接到移动版的维基百科。请修复。
  • @JanDvorak 哦,对不起,我没有意识到您不需要最短的解决方案。幂自动机的构造对于任意自动机来说是最坏情况下的指数,但我不确定这个 cas 中的特定自动机是否真的会触发它。我将不得不考虑那个。还有其他已知的最坏情况多项式时间的方法,尽管我对它们不太熟悉。
  • @JanDvorak 另外,我修复了链接。很抱歉!
猜你喜欢
  • 2019-02-01
  • 1970-01-01
  • 2020-06-14
  • 2014-05-07
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 2011-03-07
  • 2015-08-31
相关资源
最近更新 更多