百度2018春招 算法工程师笔试题--编程题2--爬山

这次百度算法工程师笔试题中的两个编程题目,第一个是排列组合问题,很闹心,耗费了不少时间,搞得第二道也没做完哭,平时还是要多练习呀。

题目: 爬山

内容:冬木市西边的园藏山是著名的旅游胜地。从空中俯瞰,园藏山可以看成一个n*m的矩阵,我们把行从上往下按1到n编号,把列从左到右按1到m编号,那么(i,j)就表示矩阵的第i行第j列的位置。我们用 hij, 表示位置(i,j)的海拔高度。

初始时,Saber在(sx, sy)这个位置, 她想前往更高的地方,每一次她可以选择向上、下、左、右其中一个方向走,但不能走出这个矩阵;同时,作为大不列颠的王,孤傲的Saber不愿意走到比她当前所在的位置海拔要低的位置,也就是说在移动的过程中,每一步她都只能向海拔不低于她当前所在的位置的那些位置移动。请你帮忙计算出她所能走到的最高高度。


Python 3 实现,

class Solution:  # 回溯法, 用栈来实现
    def findMax(self, n, m, ns, ms, maps):
        st = [[ns, ms, -1]]   # 开辟一个栈,并把初始化第一个值
        cur_max = maps[ns][ms]       # 当前最大值
        path = [[1] * m for _ in range(n)]  # 1 为可以走,0 为已经走过
        path[ns][ms] = 0            # 标记第一个开始位置已经走过

        while st:  # 如果不为空
            i, j, di, find = st[-1][0], st[-1][1], st[-1][2], 0
            i1, j1 = -1, -1  # 记录下一步可走的坐标
            while (di < 4 and find == 0):
                di += 1
                if di == 0: i1, j1 = i - 1, j   # 向上走
                elif di == 1: i1, j1 = i, j + 1  # 向右走
                elif di == 2: i1, j1 = i + 1, j  # 向下走
                elif di == 3: i1, j1 = i, j - 1  # 向左走
                if (i1 >= 0 and i1 < n) and (j1 >= 0 and j1 < m) and (path[i1][j1] == 1) and (maps[i1][j1] >= cur_max): find = 1
            if find == 1:
                st[-1][2] = di           # 当前栈顶的一个方向 进入下一个可走的方格
                st.append([i1, j1, -1])  # 入栈
                cur_max = maps[i1][j1]   # 更新最大值
                path[i1][j1] = 0         # 已经走过了
            else:
                path[st[-1][0]][st[-1][1]] = 1  # 恢复可走的方格
                st.pop()  # 出栈
        return cur_max


if __name__ == '__main__':
    n, m = map(int, input().split())  # 输入矩阵的维度
    ns, ms = map(int, input().split())
    ns, ms = ns - 1, ms - 1  # 输入开始位置
    maps = []  # 输入矩阵
    for case in range(n):
        tmp = list(map(int, input().split()))
        maps.append(tmp)

    # n, m = 4, 4  #  测试用例
    # ns, ms = 2, 0
    # maps = [[1, 1, 1, 2],
    #         [1, 2, 4, 3],
    #         [4, 2, 6, 6],
    #         [5, 1, 12, 10]]
    solu = Solution()
    print(solu.findMax(n, m, ns, ms, maps))



发现问题,可以留言交流哦。小白一个。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2023年3月11日,美团春季招聘笔试中共包含五道编程题目。以下是对每道题目的简要说明: 1. 题目一:这道题目要求解决一个数字统计的问题。可能涉及到的知识点包括数据结构、循环和条件判断等。解决问题的思路可能是使用字典等数据结构来保存统计结果,并使用循环逐个读取输入数据并进行统计。 2. 题目二:这道题目可能是一个字符串处理的问题。需要使用字符串的方法进行操作,如提取、拼接、查找和替换等。可能的解决思路包括使用正则表达式、切片和遍历等。 3. 题目三:这道题目可能涉及到算法和数据结构的知识。可能是一道涉及到数组、链表、树等数据结构的问题。解决思路可能包括遍历、递归、搜索和排序等。 4. 题目四:这道题目可能是一个动态规划的问题。需要根据给定的条件和规则,通过动态规划的方式求解问题。解决思路包括定义状态和转移方程,使用递推或记忆化搜索进行求解。 5. 题目五:这道题目可能是一个图论或网络问题。需要根据给定的图或网络结构,解决一个相关的问题。可能涉及到广度优先搜索、深度优先搜索、最短路径等知识。解决思路可能包括使用图或网络的相关算法进行求解。 以上只是对这五道编程题目的一些可能情况进行的简要描述,具体的题目内容可能会有所不同。希望这些信息能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值