【问题标题】:pathfinding in 2d array二维数组中的寻路
【发布时间】:2012-11-08 23:07:29
【问题描述】:

我目前正在做一个项目,在该项目中我必须使用包含随机数的二维数组执行任务。该数组形成一个网格,表示一座山的山峰(高度)。我解决了除最后一项之外的所有任务:

最后的任务是查找是否存在从最小峰值到最高峰值的路径(不一定是最短的)。这条路应该是不断增长的山峰,我不能踩到更低的山峰。

为了简单起见,这里有一个例子,表示在 3x3 网格上(原始的要大得多,不一定是方形的,它是根据用户的需要生成的,数字是完全随机的)。

2  4  5    
1  3  8
9  7  10

可能的方法是 1-3-7-10、1-3-8-10、1-2-4-5-8-10。

我很确定,我应该使用某种递归。 我读到了一个*探路者,但要使用它,我必须有一个带有“障碍”的“地图”(我无法跨过的节点=较小的峰),这正是我无法制作的,因为您只能在旅途中找到它。

我的意思是我可以将数字 7 放在“例外列表”中 - 因为步骤 1-9-7 是被禁止的,但步骤 1-3-7-10 是完美的,所以将 7 放在例外列表中是一个错误。

【问题讨论】:

  • 你错过了1-3-4-5-8-10 :)

标签: c# arrays queue 2d path-finding


【解决方案1】:

关键是首先将您的数组转换为“有向图”,这是一个有向图,仅包含根据您的规则的有效单元格到单元格的移动。这个有向图将是一个数组或条目列表,包括: {FromCell, ToCell}

您的有向图将包含如下数据:

2,4
4,5
5,8
1,2
1,3
1,9
3,4
3,8
3,7
8,10
7,10

从这里您应该能够应用 A* 算法或其他任何算法。

(注意:我没有发布完整的答案,因为我假设您想自己做)


也就是说,您可以通过回溯进行强力递归搜索。这是最简单的解决方案,虽然可能不是最有效的。

【讨论】:

  • 不错的解决方案:),但复杂性可能有点高。不是 O(n^2) 创建所有对加上 A* 算法的复杂度
  • 不,创建对的 O(n)。它们必须相邻,不是吗?对于任何给定的 FROM 单元,相邻的 TO 单元不会超过四个。即使不这样做,您也可以先按值对它们进行排序,这样最坏的情况就是 O(N log N)
  • 触摸..我的错。来晚了:)
  • 因此,如果我理解正确,我可以通过执行简单的搜索并将有效动作放入另一个应该是动态的二维数组中来收集有效动作。然后,当我沿着峰移动时,我应该查看峰是否与有效移动相匹配,对吗?另外,由于我仍然是编程新手,我真的不知道我应该如何递归地实现您的解决方案。
【解决方案2】:

您可以执行以下操作:

  1. 从您的矩阵创建一个加权图(每条边的权重将是 abs(两个节点的值之间的差异))

    2 - 4 - 5
    
    |   |   |
    
    1 - 3 - 8
    
    |   |   |
    
    9 - 7 - 9 
    

(2, 4) 的权重为 abs(4 - 2) = 2

(4, 5) 的权重是abs(4 - 5) = 1

  1. 应用考虑边权重的最短路径算法http://www.informatics.susx.ac.uk/courses/dats/notes/html/node147.html

  2. 删除节点值不升序的解

【讨论】:

  • 你是指模数运算还是取绝对值的差值?
  • 2个数之差的绝对值
  • 我喜欢这个主意,但我认为您没有理解我的确切问题。我的问题是我需要一个“地图”或“黑名单”,通过它我可以避免使用路径算法的非法步骤。
  • 是的……看起来是这样。我并没有真正阅读这个问题。也许您可以在类似的问题中使用我的答案:)
  • 你的想法可能对这项任务有好处,但我还不知道如何使用图表,它可能会使像我这样“简单”的任务的实现变得复杂(对于初学者来说一切都很困难像我一样,坚强)。
【解决方案3】:

(我固定了帖子并将答案放在这里。)

这就是我最终解决的方法:

因为我已经有了最小值和最大值,所以我用零包围了原始数组。零是数组的全局最小值,因为默认情况下我从不生成零。有了这个,我不必每次都检查我是在外面还是在数组中(我只踩更大的数字)。

我创建了两个队列(QueueX、QueueY)。从最小的数字开始(我在开始时将其排入队列的位置,给数组 t[x,y] 的 x,y 变量,然后出队)。

然后,我将每个较大数字的“坐标”排入相应的队列。如果我在实际点 (t[x,y]) 周围找到所有更大的数字,我将下一个 X,Y 坐标排入队列,这将是新的实际点(如开头所述)。并且检查重复。

整个事情都在一个while循环中,当其中一个队列清空时,它会停留在里面。

如果在任何给定的检查中 X,Y 与最大峰值的 X,Y 坐标相同,我返回并且存在路径。在 while 循环结束时,如果 X,Y 与 max 的 X,Y 不同,则没有路径。

我希望我的解释可以理解,英语不是我的母语。如果你愿意,我可以把代码贴在这里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多