【问题标题】:Finding path in a char array在 char 数组中查找路径
【发布时间】:2014-04-22 11:05:19
【问题描述】:

我正在做一个项目,我发现自己处于n x nchar 符号数组a,b or c 的位置,我必须检查是否有b 之间的路径第一行和最后一行。 示例 YES 输入:

我被困在这一点上?我应该采用一些众所周知的算法进行图形搜索还是有更好的方法来解决这个问题?我应该添加一个bool 数组来标记我访问过的单元格吗? 在此先感谢您的时间!

【问题讨论】:

  • 如何定义路径?
  • 你怎么能动?只有向下、向左和向右,还是向上?对角线呢?
  • @Dukeling 实际上,为了给你更多细节,在我的问题中,你可以向下、向上、向左或向右,但也可以是 NE 和 SW(唯一被禁止的邻居是 NW 和 SE)因为该表是六边形网格的表示 :) 决定省略此信息,因为它与我的问题主题无关(我可以轻松地使用不同的相邻单元定义更改算法)

标签: c++ arrays algorithm path-finding


【解决方案1】:

是的,您应该采用图算法来查找从源到目标的路径。在您的情况下,您有多个来源(第一行中的所有“b”)和多个目标(最后一行中的“b”)。

未加权图上的最短路径可以通过易于实现的BFS 非常有效地解决。处理多个源的唯一区别是在第一行使用所有 'b' 初始化队列(而不是单个节点)。

在您的图中,每个“b”单元格都是一个节点,每两个相邻的“b”单元格之间都有一条边。

请注意,BFS 是完整的(如果存在则总是找到解决方案)并且是最优的(找到最短路径)。

【讨论】:

    【解决方案2】:

    最简单的方法是分配一个大小相等、填充为零的二维数组,标记起点,并使用char 数组作为指导进行泛洪填充。当洪水填充终止时,您可以轻松检查是否标记了终点。

    洪水填充可以通过多种方式实现,只要您的问题规模较小,您如何实现并不重要。

    • 通常,最简单的方法是以递归方式进行。递归洪水填充的唯一问题是可能导致巨大的递归深度,因此递归版本是否适用实际上取决于问题的大小。

    • 1234563 /p>
    • 如果您需要有效地处理巨大的数组,您应该使用广度优先的泛洪填充,保留以先进先出方式处理的边界像素队列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-26
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      相关资源
      最近更新 更多