最近我遇到了以下面试问题?
问题:您将获得一个包含M行和N列的二维矩阵。您最初位于(0,0),这是数组中的左上角单元格。您可以向右或向下移动。数组填充1和0。 1表示您可以在该单元格中移动,0表示您无法移动该单元格。返回从左上角单元格到右下角单元格的路径数(即(0,0)到(M-1,N-1))。由于答案可能很大,因此您必须返回ans%(10 ^ 9 + 7)。
任何人都可以告诉我如何处理或任何可能有帮助的算法吗?
修改:
I have an approach
1.Start with the top-left cell,initialize count=0
do
2.Check if 1 exists in adjacent right or adjacent down cell.
3.Add the tuple (i,j) in the stack and choose the right path.
4.If we reach the bottom right cell , update count and pop from stack and go to that position (i,j).
while(stack is not empty)
5.Print count
我想知道是否有其他方法?
答案 0 :(得分:2)
您可以将问题建模为Directed Acyclic Graph (DAG),然后查找从顶点s
到顶点t
的路径数量,这在DAG中很容易使用{ {3}}
在这里,将使用以下伪代码完成:
D(0,0) = 1
D(x,y) = 0 if x < 0
D(x,y) = 0 if y < 0
D(x,y) = 0 if matrix[x][y] = 0
D(x,y-1) + D(x-1,y) Otherwise
通过在上面应用动态规划方法,您将得到一个矩阵,其中D(x,y)
表示从(0,0)
到(x,y)
的路径数,您的解决方案是{{1} }。
此解决方案的时间复杂度为D(n,m)
实现这个解决方案留给你,因为在理解它是如何完成之后它应该相当容易。
答案 1 :(得分:1)
伙计们经过我所有的努力终于我提交了我的代码,这将从(0,0)开始在矩阵中打印路径位置。
#!/usr/bin/env python
rows, cols = 0, 0
def traverse_matrix(A, directions, i, j, visited):
global rows, cols
def can_we_proceed(A, row, col, visited, current):
return (row >=0 and row < rows and col >=0 and col < cols and \
not visited[row][col] and (current == A[row][col]) and A[row][col] == 1)
visited[i][j] = True
for k in range(len(directions)):
if can_we_proceed(A, i+directions[k][0], j+directions[k][1], visited, A[i][j]):
print "({0},{1})".format(i+directions[k][0],j+directions[k][1])
traverse_matrix(A, directions, i+directions[k][0], j+directions[k][1], visited)
def mysolution(a):
global rows, cols
rows, cols = len(a) , len(a[0])
if (rows == 1 or cols == 1):
return 1
directions = [[1, 0], [0, -1], [-1, 0], [0, 1]]
visited = []
for i in range(rows):
l = []
for j in range(cols):
l.append(False)
visited.append(l)
# tup1 = ();
for i in range(rows):
for j in range(cols):
# tup1 = (i,j);
if not visited[i][j]:
traverse_matrix(A, directions, i, j, visited)
# print "Traversed {0};".format(tup1)