1. 程式人生 > >百度2018春招 演算法工程師筆試題--程式設計題2--爬山

百度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))



發現問題,可以留言交流哦。小白一個。