美团2016年编程题:拜访--动态规划

题目说明:

现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。

给定一个地图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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值