我试图找到以下问题的算法,但我不能。
你有一个矩阵,10X6如果重要的话。 (y维度上的x维度6上的10)。 算法接收2点,开点和目标点。 数组充满了0和1,它应该找到它们之间的最短路径1,并返回该路径中的第一个点(到达目标的下一个点)。 但是这里有一个问题:
每个点只能得到以下几点的值:
并使事情变得更加困难:对于每一点,其他点的价值可能会有所不同。例如:
我可以计算出这个值,所以对你来说无关紧要...... 所以我认为解决问题的唯一方法是使用递归,因为最后一个条件,但如果你找到另一种方式,那么欢迎你。
解决方案应该是 LUA , C#或 JAVA 。
答案 0 :(得分:4)
您可以简单地将矩阵解释为图形。每个单元(i,j)对应一个节点v(i,j),如果只有相应的单元是邻居且两者都设置为1,则连接两个节点。
下面的示例矩阵有四个顶点v(0,0),v(0,1),v(1,0)和v(1,1),边{v(0,0), v(0,1)}和{v(0,1),v(1,1)}(顶点v(1,0)被隔离)。
1 1
0 1
由于图表未加权,您只需使用广度优先搜索(BFS)即可找到最短路径。对于伪代码,请参阅:http://en.wikipedia.org/wiki/Breadth-first_search#Pseudocode
您对矩阵中每个条目只知道其相邻条目的限制无关紧要。在谈论图形时,这意味着顶点知道它的邻居,这正是你在BFS中所需要的。从不同的起点搜索时使用不同的图表也不会使问题更难。
对上面链接的poseudocode只有两条评论:
仅检查是否存在连接。如果您确实想要拥有最短路径,则需要更改以下内容。当从其邻居t看到新的顶点u被添加到队列时,您必须在指向t的u处存储链接。当您最终找到目标时,返回链接会为您提供最短的路径。
使用集合存储已访问过哪些元素效率低下。在您的情况下,只需使用与输入矩阵大小相同的布尔矩阵来标记所访问的顶点。