题目说明:
现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。
给定一个地图map及它的长宽n和m,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。
测试样例:
输入:[[0,1,0],[2,0,0]],2,3
输出:2
题目分析:
首先需要注意的是经理只能在左右中选择一个方向,在上下中选择一个方向,因此,经理可以选择的方向只有左上,左下,右上,右下,而具体选择那个方向则需要根据经历和商家的位置关系进行确定,一旦确定方向,便不可再进行更改。而经理到达商家的道路数等于两个方向上到达商家位置上的道路数之和,广义来讲,在map图中到达某一点的道路数等于从两个方向上到达该点的道路数之和。
python实现代码:
class Visit:
def countPath(self, map, n, m):
# write code here
dp = [[0] * m] * n # 初始话dp数组
for i in range(n):
for j in range(m):
if map[i][j] == 1:
x1, y1 = i, j # 找到经理的位置
if map[i][j] == 2:
x2, y2 = i, j # 找到商家的位置
if x1 == x2 and y1 == y2: # 如果经理和商家在同一个位置,返回0
return 0
if x1 < x2: # 确定经理应当前进的方向
dx = 1
else:
dx = -1
if y1 < y2:
dy = 1
else:
dy = -1
# 构造dp数组的边,初始话dp数组,需要注意道路堵塞的情况
dp[x1][y1] = 1
for x in range(x1 + dx, x2 + dx, dx):
dp[x][y1] = dp[x-dx][y1] if map[x][y1] != -1 else 0
for y in range(y1 + dy, y2 + dy, dy):
dp[x1][y] = dp[x1][y-dy] if map[x1][y] != -1 else 0
for x in range(x1 + dx, x2 + dx, dx):
for y in range(y1 + dy, y2 + dy, dy):
dp[x][y] = dp[x-dx][y] + dp[x][y-dy] if map[x][y] != -1 else 0
return dp[x2][y2]
v = Visit()
print(v.countPath([[0,0,0,0,0],[0,0,0,0,0],[0,1,0,0,2]],3,5))