爬山问题(百度笔试2018)

问题描述

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

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

输入格式:

第一行数据为n和m;第二行数据为当前所在的位置i,j;接下来的n行和m列为海拔矩阵

输出格式:

输出最高海拔

问题分析

第一步,当从原始点出发,分别往上、下、左、右方向走一步,然后判断当前的位置是否越界和是否是比原位置大;

第二步,如果该点为越界且比原始位置海拔高,则把该点当做新的原点,重新寻找最高海拔;直到四个方向均已达到停止条件;

第三部,从四个方向的海拔中选择一个最高的作为最高海拔。

python代码

n, m = [int(x) for x in raw_input().split()]
sx, sy = [int(s) for s in raw_input().split()]

arr = []
for i in range(n):
    arr.append([int(a) for a in raw_input().split()])

def step(x,y,h):
    # 超出边界,则返回原始海拔
    if x == n or x < 0 or y == m or y < 0:
        return h
    # 如果当前海拔比之前高,则返回当前高海拔
    if arr[x][y] > h:
        return arr[x][y]
    # 否则返回原始海拔
    else:
        return h
# 核心程序,寻找最高海拔,从某一点开始寻找最高点
def find(sx,sy,high):
    # 左边点 坐标
    x_left = sx - 1
    y_left = sy
    # 右边点坐标
    x_right = sx + 1
    y_right = sy
    # 上边点坐标 
    x_up = sx
    y_up = sy + 1
    # 下边点坐标
    x_down = sx
    y_down = sy - 1
    # 是否需要从左边点走,左边点海拔大于原海拔
    h_left = step(x_left, y_left, high)
    # 从左边点接着寻找最高海拔
    if h_left > high:
        h_left = find(x_left, y_left, h_left)
    # 是否需要从右边点走,右边点海拔大于原海拔
    h_right = step(x_right, y_right, high)
    # 从右边点接着寻找最高海拔
    if h_right > high:
        h_right = find(x_right,y_right,h_right)
    # 是否需要从上边点走,上边点海拔大于原海拔
    h_up = step(x_up, y_up, high)
    # 从上边点接着寻找最高海拔
    if h_up > high:
        h_up = find(x_up,y_up,h_up)
    # 是否需要从下边点走,下边点海拔大于原海拔
    h_down = step(x_down, y_down, high)
    # 从上边点接着寻找最高海拔
    if h_down > high:
        h_down = find(x_down,y_down,h_down)
    # 最后的四个方向找到的海拔中的最高值
    return max(h_left,h_right,h_up,h_down)
    
h = arr[sx-1][sy-1]
print(find(sx-1,sy-1,h))

猜你喜欢

转载自blog.csdn.net/legend_hua/article/details/79997306
今日推荐