题目
有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。注意这次的网格中有些障碍点是不能走的。
给定一个int[][] map(C++ 中为vector >),表示网格图,若map[i][j]为1则说明该点不是障碍点,否则则为障碍。另外给定int x,int y,表示网格的大小。请返回机器人从(0,0)走到(x - 1,y - 1)的走法数,为了防止溢出,请将结果Mod 1000000007。保证x和y均小于等于50
思路
此题用dp算法来求解,格子只能向右或者向下,那么对于i,j来说,分别对应(i-1,j)和(i,j-1),另外根据m矩阵来判断障碍点,即可求得。
代码
class Robot:
def countWays(self
, m
, x
, y
):
if m
[0][0] == 0:
return 0
dp
= [[0 for _
in range(y
)] for _
in range(x
)]
dp
[0][0] = 1
print(dp
)
for i
in range(1,x
):
if m
[i
][0]==1:
dp
[i
][0]=dp
[i
-1][0]
else:
dp
[i
][0] = 0
for j
in range(1,y
):
if m
[0][j
]==1:
dp
[0][j
]=dp
[0][j
-1]
else:
dp
[0][j
]=0
for i
in range(1,x
):
for j
in range(1,y
):
if m
[i
][j
]==1:
dp
[i
][j
]=dp
[i
-1][j
]% 1000000007 + dp
[i
][j
-1]% 1000000007
else:
dp
[i
][j
]=0
return dp
[x
-1][y
-1]% 1000000007