博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
拜访--美团笔试题 (动态规划)
阅读量:6996 次
发布时间:2019-06-27

本文共 3355 字,大约阅读时间需要 11 分钟。

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

给定一个地图map及它的长宽nm,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。

测试样例:
[[0,1,0],[2,0,0]],2,3
返回:2
# -*- coding:utf-8 -*-class Visit:    def countPath(self, map, n, m):        # write code here        if n <= 0 or m <= 0:   # 健壮性            return -1        #遍历整个地图获得起始点和终止点        start = []        end = []        for i in range(n):      # 找出起始点和终点的坐标值            for j in range(m):                if map[i][j] == 1:                    start.append(i)   #注意此处的赋值语句                    start.append(j)                    map[i][j] = 0     # 并把这个点设为0,为后续的判断提供方便(重要)                if map[i][j] == 2:                    end.append(i)                    end.append(j)                    map[i][j] = 0     # 并把这个点设为0,为后续的判断提供方便(重要)        rows = abs(start[0] - end[0]) + 1   # 起始点和终点构成的矩阵的行数        cols = abs(start[1] - end[1]) + 1   #                     列数        f = [[0 for col in range(cols)] for row in range(rows)] # 存放中间结果值                if start[0] > end[0]: # 调整起始点和终点的位置关系,使得起点总是在上边            tmp0 = start[0]            tmp1 = start[1]            start[0] = end[0]            start[1] = end[1]            end[0] = tmp0            end[1] = tmp1        if start[1] == end[1]:       # 在同一列            return 1        if start[0] == end[0]:       # 在同一行            return 1        #  分为两种情况,一种是向右或向下走,另一种是向左或向下走        if start[1] < end[1]:       # 向右向下行走            f[0][0] = 1              # 初始状态            for i in range(1,cols):    #单独的一行处理                if map[start[0]][start[1] + i] == -1:                    f[0][i] = 0      # 第一行从第二个元素起                if map[start[0]][start[1] + i] == 0:                    f[0][i] = f[0][i-1]            for j in range(1,rows):        #单独的一列处理                if map[start[0] + j][start[1]] == -1:                    f[j][0] = 0                if map[start[0] + j][start[1]] == 0:                    f[j][0] = f[j-1][0]            for i in range(1,cols):                for j in range(1,rows):                    if map[start[0] + j][start[1] + i] == -1:                        f[j][i] = 0                    if map[start[0] + j][start[1] + i] == 0:                        f[j][i] = f[j - 1][i] + f[j][i - 1]            return f[rows - 1][cols - 1]                if start[1] > end[1]:       # 向左向下行走            f[0][cols - 1] = 1            for i in range(1,cols):        #单独的一行处理                if map[start[0]][start[1] - i] == -1:                    f[0][cols - 1 - i] = 0       # 第一行右起第二个元素                if map[start[0]][start[1] - i] == 0:                    f[0][cols - 1 - i] = f[0][cols - 1 - i + 1]            for j in range(1,rows):        #单独的一列处理                if map[start[0] + j][start[1]] == -1:                    f[j][cols - 1] = 0                if map[start[0] + j][start[1]] == 0:                    f[j][cols - 1] = f[j-1][cols - 1]            for i in range(1,cols):                for j in range(1,rows):                    if map[start[0] + j][start[1] - i] == -1:                        f[j][cols - 1 - i] = 0                    if map[start[0] + j][start[1] - i] == 0:                        f[j][cols - 1 - i] = f[j - 1][cols - 1 - i] + f[j][cols - 1 - i - 1]            return f[rows - 1][0]

 

转载于:https://www.cnblogs.com/simplepaul/p/7256335.html

你可能感兴趣的文章
引用MinGW生成的.dll.a后出现的问题
查看>>
51Nod1130斯特林近似
查看>>
dede 调用原图的路径
查看>>
浅析设计模式(四)——建造者模式
查看>>
LeetCode——N-Queens
查看>>
JS中的正则表达式
查看>>
Mysql数据库的基本概念
查看>>
Linux中main是如何执行的
查看>>
Linux,在不使用U盘的情况下使用wubi.exe程序在Win7上安装ubuntu-14.04.3版系统
查看>>
SQLite简单教程
查看>>
网站推广必备的16个营销工具
查看>>
解决sublime text3运行PyQt5代码不能显示窗口的问题
查看>>
csss属性选择器
查看>>
java基础 布局管理器
查看>>
Assetbundle资源单一打包,以及加载方法
查看>>
unity启动第三方软件
查看>>
什么才是程序员的核心竞争力?
查看>>
DOS命令批量重命名文件配合Excel 操作备忘
查看>>
使用Three.js里的各种光源
查看>>
flask cookie
查看>>