计算二进制矩阵中的所有路径

时间:2017-10-16 06:14:51

标签: algorithm math matrix graph

NxN的矩阵具有0和1 0表示他可以通过此单元格,1表示它被阻止。
他可以向四个方向移动{如果他的当前位置是(X,Y),他可以移动到(X + 1,Y),(X-1,Y),(X,Y + 1),(X ,Y-1)}。
如果第一个单元(1,1)和最后一个单元(N,N)包含' 1'那么他就不能突破矩阵了。

他想知道他可以走出监狱的唯一可能路径的总数。最初Alfie在单元格(1,1)中,而单元格的出口(N,N)。

示例:
输入
4
0 1 1 0
0 0 1 0
0 0 0 0
0 1 1 0
输出:
2个

输入:
4
0 0 0 1
0 0 0 0
1 1 1 0
1 0 0 0
输出:
4个

输入:
4
0 1 1 0
0 0 1 1
0 0 0 0
0 1 0 0
输出:
4个

我知道当它向下和向右移动两个方向时如何解决 但是当它向四个方向移动时如何处理这样的问题..?

1 个答案:

答案 0 :(得分:2)

关于相关问题的简单部分"当它仅向下和向右移动两个方向时#34;是路径不能自己加倍。如果你允许所有四个方向,就像你当前的问题一样,你需要限制Alfie可能不会多次访问一个单元格。没有这个限制,Alfie可以在两个牢房之间来回振荡,或者继续围成一圈,造成无限多条路径。所以我们添加了这个限制:最多可以访问一次单元格。

我们需要强制执行该限制。一种简单的方法是制作第二个NxN矩阵,但这个矩阵仅使用布尔值。当且仅当Alfie在当前路径中访问过该单元格时,我们可以将其称为visited,并按visited[X][Y]定义True;否则是False。 (另一种方法是用2标记一个访问过的单元格,以区别于墙壁或非访问单元格 - 我后来想到了这个,但它会使用更少的内存。)

现在有多种算法可以解决问题。也许最简单的方法是使用一个外部例程来设置内容并调用内部递归例程来添加路径。这是一些类似Python的伪代码,为了清晰起见忽略了一些效率。请注意,Python中的矩阵是从零开始的,因此监狱的两个角落位于(0,0)和(N-1,N-1)。

def count_paths(N, prison):
    """Return the total number of unique possible paths which Alfie can
    take to escape the prison."""

    def count_paths_recurse(X, Y, prison, visited):
        """Return the number of paths starting from cell (X, Y) where
        pathcount visited[] marks the cells not to visit."""
        if X == N-1 and Y == N-1:  # reached the exit cell
            return 1
        visited[X][Y] = True
        pathcount = 0
        for direction in (right, left, down, up):
            Xnew, Ynew = neighoring cell coordinates in that direction
            if Xnew and Ynew are inside the prison
                    and prison[Xnew][Ynew] == 0
                    and not visited[Xnew][Ynew]:
                pathcount += count_paths_recurse(Xnew, Ynew, prison, visited)
        visited[X][Y] = False
        return pathcount

    if prison is not an NxN matrix containing only 0s and 1s:
        raise an error
    create visited as an NxN matrix containing only False
    if prison[0][0] != 0 or prison[N-1][N-1] != 0:
        return 0
    return count_paths_recurse(0, 0, prison, visited)

由于每个单元格的方向按照一致的顺序(在此代码中向右,向左,向下,向上),因此每条路径都是唯一的。我已经从这个算法构建了一个完整的Python程序,它可以工作,在所有三个例子中给出了所需的答案。