Algorithm 查找方阵上两点之间的所有路径
在标记为副本之前,请仔细阅读 我有一个矩阵:Algorithm 查找方阵上两点之间的所有路径,algorithm,tree,graph-theory,Algorithm,Tree,Graph Theory,在标记为副本之前,请仔细阅读 我有一个矩阵: 0 x 0 0 0 0 x 0 0 0 您不能在矩阵中沿对角线移动 我想找到两个“x”之间所有可能的路径。唯一的条件是,路径不能穿过自身(因此没有循环)。显然,DSF算法无法找到每一条路径(要了解原因,请参阅本文:) 那么还应该使用什么算法呢?没有访问集的DFS将在图形中查找所有路径 您将必须维护一个只与当前路径相关而非全局的特殊访问集变量。为此,每次“完成”探索顶点时,都必须将其从集合中移除 伪代码: DFS(source,target,visit
0 x 0
0
0
0 x 0 0
0
您不能在矩阵中沿对角线移动 我想找到两个“x”之间所有可能的路径。唯一的条件是,路径不能穿过自身(因此没有循环)。显然,DSF算法无法找到每一条路径(要了解原因,请参阅本文:)
那么还应该使用什么算法呢?没有访问集的DFS将在图形中查找所有路径 您将必须维护一个只与当前路径相关而非全局的特殊访问集变量。为此,每次“完成”探索顶点时,都必须将其从集合中移除 伪代码:
DFS(source,target,visited,path):
if (source == target): //stop clause
print path
return
for each son v of source:
if v is in visited: //the vertex is already in the current path
continue
path.append(v)
visited.add(v)
DFS(v,target,visited,path)
visited.remove(v)
path.deleteLast()
此解决方案的复杂性是指数级的,但这是意料之中的,因为两个节点之间的简单路径数是指数级的。我的专长
哈斯克尔代码:
import Control.Monad (guard)
paths (a,b) (a',b') m n = solve [(a',b')] where
solve result@((y,x):_) = do
next@(y',x') <- [(y,x + 1),(y,x - 1),(y + 1,x),(y - 1,x)]
guard (y' >= 0 && y' < m && x' >= 0 && x' < n && notElem (y',x') result)
if next == (a,b) then [(next:result)] else solve (next:result)
我对与OP相同的问题感兴趣。我读过关于它的文章,很难找到合适的解决方案。许多解决方案都有图形方法,但没有矩阵。@amit的评论和这个对我很有帮助 在这里,您可以找到一个有效的解决方案:
看起来很有希望。我将实施它,并尽快给你反馈。你能给出示例矩阵的答案吗?所有路径的计数?为什么?这是一个自制的无意义矩阵!
*Main> take 2 . paths (0,3) (3,1) 5 $ 5
[[(0,3),(0,2),(0,1),(0,0),(1,0),(1,1),(1,2),(1,3),(1,4),(2,4),(2,3),(2,2),(2,1),(2,0),(3,0),(4,0),(4,1),(4,2),(4,3),(4,4),(3,4),(3,3),(3,2),(3,1)]
,[(0,3),(0,2),(0,1),(1,1),(1,2),(1,3),(1,4),(2,4),(2,3),(2,2),(2,1),(2,0),(3,0),(4,0),(4,1),(4,2),(4,3),(4,4),(3,4),(3,3),(3,2),(3,1)]]
(0.02 secs, 1595416 bytes)
*Main> length . paths (0,3) (3,1) 5 $ 5
4914
(1.28 secs, 100724732 bytes)
*Main Data.List Data.Ord> minimumBy (comparing length) . paths (0,3) (3,1) 5 $ 5
[(0,3),(1,3),(2,3),(3,3),(3,2),(3,1)]
(1.42 secs, 101955224 bytes)