在2d数组中寻路

时间:2012-11-20 19:33:43

标签: c# arrays queue 2d pathfinder

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

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

这是一个例子,为了简单起见,在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放在例外列表上将是一个错误。

3 个答案:

答案 0 :(得分:3)

关键是首先将您的数组转换为“有向图”,这是一个有向图,仅根据您的规则由有效的细胞到细胞移动组成。这个有向图将是一个数组或条目列表,包括:{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 *算法或其他任何算法。

(注意:我没有发布完整的答案,因为我认为你自己想要这样做)


那就是说,你可以用反向追踪进行强力递归搜索。这是最简单的解决方案,但可能效率不高。

答案 1 :(得分:0)

您可以执行以下操作:

  1. 从矩阵中创建加权图(每条边的权重为abs(两个节点的值之差))

    2 - 4 - 5
    
    |   |   |
    
    1 - 3 - 8
    
    |   |   |
    
    9 - 7 - 9 
    
  2. (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 :(得分:0)

(我修了帖子,把答案放在这里。)

这就是我最终解决的问题:

由于我已经有了最小和最大位置,我用零包围原始数组。零是数组的全局最小值,因为默认情况下我从不生成零。有了这个,我不必每次都检查我是否在阵列中(或者我只是踩着更大的数字)。

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

然后我将每个更大的数字排在队列中。 "坐标"进入各自的队列。如果我在实际点(t [x,y])周围找到了所有较大的数字,我会将下一个X,Y坐标排队,这将是新的实际点(如开头所述)。检查重复进行。

整个过程都是在一个循环中,当其中一个队列空出时,它会保持不变。

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

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